Tb/clock 這題要求給dut模塊一個時鐘。 module top_module ( ); reg clk; always #5 clk=~clk; initial begin clk = 0; end dut u0(clk); endmodule Tb/tb1 產生指定的波形,使用延時語句給信 ...
Tb/clock
這題要求給dut模塊一個時鐘。
module top_module ( ); reg clk; always #5 clk=~clk; initial begin clk = 0; end dut u0(clk); endmodule
Tb/tb1
產生指定的波形,使用延時語句給信號賦值即可。
module top_module ( output reg A, output reg B );// // generate input patterns here initial begin A=0; B=0; #10 A=1; #5 B=1; #5 A=0; #20 B=0; end endmodule
Tb/and
題目要求對一個與門進行測試,要求產生波形圖中的激勵向量。
module top_module(); reg [1:0]in; wire out; initial begin in = 2'b00; #10 in = 2'b01; #10 in = 2'b10; #10 in = 2'b11; end andgate u_and(in,out); endmodule
Tb/tb2
同樣是寫一個testbench,但是比上面略複雜一點。
module top_module(); reg clk; reg in; reg [2:0]s; wire out; initial begin clk=0; in=0; s=2; #10 s=6; #10 in=1;s=2; #10 in=0;s=7; #10 in=1;s=0; #30 in=0; end always #5 clk=~clk; q7 u_q7(clk,in,s,out); endmodule
Tb/tff
要求驗證一個T觸發器,T觸發器在輸入t為1時輸出不斷地發展。
module top_module (); reg clk; reg reset; reg t; wire q; always #5 clk=~clk; initial begin clk=0; reset=1; t=0; #10 reset=0;t=1; end tff u_t(clk,reset,t,q); endmodule
Cs450/timer
load信號為1載入data,load為0電路為一個倒數器,當倒計數為0時tc為1。
module top_module( input clk, input load, input [9:0] data, output tc ); reg [9:0]counter; always@(posedge clk) begin if(load) counter <= data; else counter <= (counter!=0)?(counter - 1'b1):0; end assign tc=(counter==0); endmodule
Cs450/counter 2bc
這道題要求實現一個分支預測器,沒學過電腦體繫結構,百度了一下,分支預測器在分支指令執行結束之前猜測哪一路分支將會被運行,以提高處理器的指令流水線的性能。使用分支預測器的目的,在於改善指令管線化的流程。現代使用指令管線化處理器的性能能夠提高,分支預測器對於現今的指令流水線微處理器獲得高性能是非常關鍵的技術。
這裡其實也不用對分支預測器特別瞭解,能按照狀態轉換圖寫出代碼就行了。
懶得寫兩個always了,直接一個always給實現了。
module top_module( input clk, input areset, input train_valid, input train_taken, output reg[1:0] state ); parameter SNT=0,WNT=1,WT=2,ST=3; always@(posedge clk or posedge areset) begin if(areset) state <= WNT; else if(train_valid)begin case(state) SNT:state <= train_taken?WNT:SNT; WNT:state <= train_taken?WT:SNT; WT:state <= train_taken?ST:WNT; ST:state <= train_taken?ST:WT; endcase end end endmodule
Cs450/history shift
題目很長,看了半天也不是特別懂,要寫代碼的話其實直接看description就行了。
當predict_valid
= 1,移入predict_taken到predict_history
,當train_mispredicted
= 1則移入train_taken到train_history
,註意misprediction優先順序更高,所以放在上面的else if中。
module top_module( input clk, input areset, input predict_valid, input predict_taken, output reg[31:0] predict_history, input train_mispredicted, input train_taken, input [31:0] train_history ); always@(posedge clk or posedge areset) begin if(areset) predict_history <= 32'd0; else if(train_mispredicted)begin predict_history <= {train_history[30:0],train_taken}; end else if(predict_valid)begin predict_history <= {predict_history[30:0],predict_taken}; end end endmodule
Cs450/gshare
這題是真的徹底看不懂了,抄了網上大佬的答案。鏈接:http://blog.74ls74.org/2022/03/17/20220317_HDLbits_uwaterloo_cs450/
module top_module( input clk, input areset, input predict_valid, input [6:0] predict_pc, output predict_taken, output reg [6:0] predict_history, input train_valid, input train_taken, input train_mispredicted, input [6:0] train_history, input [6:0] train_pc ); reg [1:0] PHT[127:0]; integer i; always @(posedge clk, posedge areset) begin if (areset) begin predict_history <= 0; for (i=0; i<128; i=i+1) PHT[i] <= 2'b01; end else begin if (train_valid && train_mispredicted) predict_history <= {train_history[6:0], train_taken}; else if (predict_valid) predict_history <= {predict_history[6:0], predict_taken}; if (train_valid) begin if (train_taken) PHT[train_history ^ train_pc] <= (PHT[train_history ^ train_pc] == 2'b11) ? 2'b11 : (PHT[train_history ^ train_pc] + 1); else PHT[train_history ^ train_pc] <= (PHT[train_history ^ train_pc] == 2'b00) ? 2'b00 : (PHT[train_history ^ train_pc] - 1); end end end assign predict_taken = PHT[predict_history ^ predict_pc][1]; endmodule