2016-03-22 88 views
0

我正在編碼,只要'clk'更改爲'1',就會將'd'的值放入'z'中。基於clk的值更改不適用於隨機數

例如,

clk=0 d=  15, z=   x 
clk=1 d=  20, z=  20 
clk=0 d=  25, z=  20 
clk=1 d=  30, z=  30 

它把 'd' 的值變成 'Z' 每當clk爲 '1'。

所以下面的代碼是對隨機數重複20次的代碼。

module lab9; 
reg [31:0] d; 
reg clk, enable, flag; 
wire [31:0] z; 
reg [31:0] e; 
register #(32) mine(z, d, clk, enable); 

always begin 
#5 clk = ~clk; 

end 

initial 
#1 $monitor("%5d: clk=%b,d=%d,z=%d,expect=%d", $time,clk,d,z, e); 

initial begin 
clk=0; 
flag = $value$plusargs("enable=%b", enable); 

repeat (20) begin 
#2 d = $random; 
end 
$finish; 

end 

endmodule 

和輸出我得到:

1: clk=0,d=   x,z=   x,expect=   x 
    2: clk=0,d= 303379748,z=   x,expect=   x 
    4: clk=0,d=3230228097,z=   x,expect=   x 
    5: clk=1,d=3230228097,z=3230228097,expect=   x 
    6: clk=1,d=2223298057,z=3230228097,expect=   x 
    8: clk=1,d=2985317987,z=3230228097,expect=   x 
    10: clk=0,d= 112818957,z=3230228097,expect=   x 
    12: clk=0,d=1189058957,z=3230228097,expect=   x 
    14: clk=0,d=2999092325,z=3230228097,expect=   x 
    15: clk=1,d=2999092325,z=2999092325,expect=   x 
    16: clk=1,d=2302104082,z=2999092325,expect=   x 
    18: clk=1,d= 15983361,z=2999092325,expect=   x 
    20: clk=0,d= 114806029,z=2999092325,expect=   x 
    22: clk=0,d= 992211318,z=2999092325,expect=   x 
    24: clk=0,d= 512609597,z=2999092325,expect=   x 
    25: clk=1,d= 512609597,z= 512609597,expect=   x 
    26: clk=1,d=1993627629,z= 512609597,expect=   x 
    28: clk=1,d=1177417612,z= 512609597,expect=   x 
    30: clk=0,d=2097015289,z= 512609597,expect=   x 
    32: clk=0,d=3812041926,z= 512609597,expect=   x 
    34: clk=0,d=3807872197,z= 512609597,expect=   x 
    35: clk=1,d=3807872197,z=3807872197,expect=   x 
    36: clk=1,d=3574846122,z=3807872197,expect=   x 
    38: clk=1,d=1924134885,z=3807872197,expect=   x 
    40: clk=0,d=3151131255,z=3807872197,expect=   x 

在6號線這個輸出的需要是「2223298057」,但仍然有,即使其CLK被設置爲「1前面的「Z」的價值」。

我該如何解決這個問題?

+0

什麼是'register'? – toolic

+0

@toolic我沒有該文件,但它編譯並運行。 –

+0

問題是你的問題在註冊表內。我假設z是寄存器的輸出,因爲代碼中沒有其他東西驅動z。 – toolic

回答

1

它將從輸出行爲似乎你已經提出的是

register #(32) mine(z, d, clk, enable); 

是一組32 d-型觸發器,其給定它的名字及你還連接的信號的名稱似乎是這樣。如果您提供了register的代碼,回答您的問題會更容易。

因此,如果register確實是一組32個D型觸發器,那麼在時間6時不會期望z發生變化。這不是觸發器的行爲方式:觸發器的輸出如何工作:觸發器僅在時鐘的一個(上升沿或下降沿)改變。

鑑於這些D型觸發器在您開始本練習之前就已經存在,您似乎很快改變d。您應該每個時鐘(clk)週期更換一次,即每#10一次。換句話說,儘量chaninging

#2 d = $random; 

#10 d = $random; 
+0

stangely我沒有任何註冊的源代碼。 (我在這個源代碼的同一個文件夾中也沒有名爲register.v的文件,也在外面)它只是編譯並運行,即使輸出不是我想要的。 –

+0

@ online.0227你用來編譯和運行仿真的完整命令是什麼?如果您是從GUI驅動它,那麼該命令可能是模擬器輸出中的第一件事。 –

+0

iverilog -o circuit lab9_part2.v && vvp circuit + enable = 1 –

1

您的註冊表已正常工作。寄存器是邊沿觸發的;在時間步驟5和6之間沒有時鐘邊緣,所以z的值未更新。

如果您希望z只要時鐘爲高電平持續更新,就需要一個鎖存器,而不是寄存器。然而,應該預先警告,時序分析在包含鎖存器的設計中要困難得多,因此通常應避免這種情況。