2013-03-20 130 views
0

任何人都可以幫我寫下面代碼的verilog測試平臺代碼! 我有嘗試,但它是行不通的!Verilog測試平臺代碼

module top(clock_in, Reset, Hold, up_down, Led_Out, f);  
    input clock_in, Reset, Hold, up_down; 
    output  [6:0] Led_Out;   
    output wire [3:0] f; 

    wire pulse; 

    clock_design temp0(clock_in, pulse); 
    up_down_counter temp1(pulse, Reset, Hold, up_down, f); 
    led7 temp2(Led_Out, f); 
endmodule 

LED7:

module led7(iOut, iQ); 
    output reg [6:0] iOut; 
    input  [3:0] iQ; 

    always @(iQ) 
    case (iQ) 
     4'b0000: iOut = 7'b0000001; //0 
     4'b0001: iOut = 7'b1001111; //1 
     4'b0010: iOut = 7'b0010010; //2 
     4'b0011: iOut = 7'b0000110; //3 
     4'b0100: iOut = 7'b1001100; //4 
     4'b0101: iOut = 7'b0100100; //5 
     4'b0110: iOut = 7'b0100000; //6 
     4'b0111: iOut = 7'b0001111; //7 
     4'b1000: iOut = 7'b0000000; //8 
     4'b1001: iOut = 7'b0000100; //9 
     default: iOut = 7'b0000000; //default 
    endcase 
    endmodule 

up_down_counter:

module up_down_counter (Clock,Reset,Hold,up_down,Q); 
    input Clock,Reset,Hold,up_down; 
    output reg [3:0] Q; 
    integer direction; 


    always @(posedge Clock) 
    begin 
     if(up_down) 
     direction = 1; 
     else 
     direction = -1; 

    if (!Reset && direction == 1) 
     Q <= 0; 
     else if(!Reset && direction == -1) 
     Q <= 1001; 
     else if (!Hold)   
     Q <= Q + direction; 

     if (direction==1 && Q[0]==1 && Q[1]==0 &&Q[1]==0 && Q[3]==1) 
     Q <= 0; 
     else if (direction==-1 && Q[0]==0 && Q[1]==0 &&Q[2]==0 && Q[3]==0) 
     Q <= 1001; 
     end 
    endmodule 

clock_design:

module clock_design (clock_in,clock_out); 
    input clock_in; 
    output clock_out; 
    parameter which_clock=1; 
    reg [31:0] divided_clocks=0; 

    always @(posedge clock_in) 
    divided_clocks = divided_clocks +1; 

    assign clock_out = divided_clocks[which_clock]; 
endmodule 

我的測試臺代碼

module counter_tb; 
    reg [6:0] Led_Out_tb; 
    wire [3:0] f_tb; 
    reg clock_in_tb, Reset_tb, Hold_tb, up_down_tb; 

    top dut(clock_in_tb, Reset_tb,Hold_tb, up_down_tb, Led_Out_tb, f_tb); 

    initial begin 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 1; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 1;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    #10 clock_in_tb = 0;Hold_tb = 0;Reset_tb = 1; up_down_tb = 0; 
    end 
endmodule 
+3

「不起作用」對您的問題沒有用處。 – toolic 2013-03-20 11:53:04

+0

對'divided_clocks'使用非阻塞賦值。 – toolic 2013-03-20 11:55:13

回答

6

測試平臺明智我會成立一個時鐘和復位這樣的:

reg clk ; //Rising edge every 10 timesteps 
initial begin 
    clk = 0; 
    #5; 
    forever begin 
    #5 clk = ~clk; 
    end 
end 

// TB Reset_tb 
reg Reset_tb 
initial begin 
    Reset_tb = 0; 
    @(posedge clk); 
    @(posedge clk); 
    Reset_tb = 1; 
end 

並進行實際測試是這樣的:

//The actual test 
initial begin 
    Hold_tb = 0; 
    up_down_tb = 1; 
    repeat (50) begin 
    @(posedge clk); 
    end 
    up_down_tb = 1; 
    repeat (50) begin 
    @(posedge clk); 
    end 
    $finish(); 
end 

關於代碼

你有一段看起來應該是always @(posedge clk)塊中的組合邏輯。

always @(posedge Clock) 
begin 
    if(up_down) 
    direction = 1; 
    else 
    direction = -1; 

我想這應該是:

always @* begin 
    if(up_down)begin 
    direction = 1; 
    end 
    else begin 
    direction = -1; 
    end 
end 

如果不包括begin end的if語句僅適用於下一行。我會更頻繁地使用開始結束,所以你的代碼明確地顯示了你的意圖。

你有下面的一段代碼:

if (!Reset && direction == 1) 
    Q <= 0; 
    else if(!Reset && direction == -1) 
    Q <= 1001; 
    else if (!Hold)   
    Q <= Q + direction; 

    if (direction==1 && Q[0]==1 && Q[1]==0 &&Q[1]==0 && Q[3]==1) 
    Q <= 0; 
    else if (direction==-1 && Q[0]==0 && Q[1]==0 &&Q[2]==0 && Q[3]==0) 
    Q <= 1001; 

是否有一個4號,如果失蹤別的嗎? if (direction==1 && Q[0]==1 && Q[1]==0 &&Q[1]==0 && Q[3]==1)

我會避免在RTL中使用整數類型,因爲這往往是矯枉過正,尤其是在這裏你只是存儲1或-1,真的只需要1位的值。寄存器和電線可以簽署:

reg signed signed_reg ; 
reg signed [7:0] signed_reg8; 

還可以聲明常數簽署:

reg_signed = 1'sd-1 ; //1Bit Signed Decimal value -1 

我覺得不好的做法,使用大小寫混合信號的名字,我總是用小寫。常量如參數和localparams都是大寫。這使得拼寫錯誤的可能性小一些,你可能花費很多時間試圖解決爲什麼某些東西不能正常工作,那麼你意識到其中一個連接使用小寫而不是大寫第一個字符。