基于 clk 的值更改不适用于随机数
Value changes based on clk doesn't work for random numbers
我正在编写代码,每当 'clk' 更改为“1”时,将 'd' 的值放入 'z'。
例如,
clk=0 d= 15, z= x
clk=1 d= 20, z= 20
clk=0 d= 25, z= 20
clk=1 d= 30, z= 30
只要 clk 为“1”,它就会将 'd' 的值放入 'z'。
所以下面是为随机数重复 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”,但仍然具有先前 'z' 的值,即使其 clk 设置为“1”。
我该如何解决这个问题?
您的收银机已经正常工作。寄存器是边沿触发的;在时间步长 5 和 6 之间没有时钟 edge,因此 z
的值不会更新。
如果你希望z
只要时钟为高就不断更新,你需要一个锁存器,而不是寄存器。但是,请注意,在包含锁存器的设计中,时序分析要困难得多,因此通常应避免使用它们。
从您提供的输出行为看来
register #(32) mine(z, d, clk, enable);
是一组32个D型触发器,从它的名字和你连接的信号的名字来看,好像也是如此。如果您提供了 register
.
的代码,那么回答您的问题会更容易
所以,如果 register
确实是一组 32 个 D 型触发器,你不会期望 z
在时间 6 发生变化。这不是任何一种触发器 -触发器的行为:触发器的输出仅在时钟的一个(上升或下降)边缘发生变化。
考虑到这些 D 型触发器在您开始本练习之前就已存在,看来您的更改 d
太快了。您应该每个时钟 (clk
) 周期更改一次它,即每 #10
一次。换句话说,尝试改变
#2 d = $random;
到
#10 d = $random;
我正在编写代码,每当 'clk' 更改为“1”时,将 'd' 的值放入 'z'。
例如,
clk=0 d= 15, z= x
clk=1 d= 20, z= 20
clk=0 d= 25, z= 20
clk=1 d= 30, z= 30
只要 clk 为“1”,它就会将 'd' 的值放入 'z'。
所以下面是为随机数重复 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”,但仍然具有先前 'z' 的值,即使其 clk 设置为“1”。
我该如何解决这个问题?
您的收银机已经正常工作。寄存器是边沿触发的;在时间步长 5 和 6 之间没有时钟 edge,因此 z
的值不会更新。
如果你希望z
只要时钟为高就不断更新,你需要一个锁存器,而不是寄存器。但是,请注意,在包含锁存器的设计中,时序分析要困难得多,因此通常应避免使用它们。
从您提供的输出行为看来
register #(32) mine(z, d, clk, enable);
是一组32个D型触发器,从它的名字和你连接的信号的名字来看,好像也是如此。如果您提供了 register
.
所以,如果 register
确实是一组 32 个 D 型触发器,你不会期望 z
在时间 6 发生变化。这不是任何一种触发器 -触发器的行为:触发器的输出仅在时钟的一个(上升或下降)边缘发生变化。
考虑到这些 D 型触发器在您开始本练习之前就已存在,看来您的更改 d
太快了。您应该每个时钟 (clk
) 周期更改一次它,即每 #10
一次。换句话说,尝试改变
#2 d = $random;
到
#10 d = $random;