基于 clk 的值更改不适用于随机数



每当"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",但即使其clk设置为"1",仍具有上一个"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;

您的寄存器已经正常工作。寄存器是边缘触发的;在时间步长5和6之间没有时钟边缘,因此z的值不更新。

如果希望z在时钟为高电平时持续更新,则需要锁存器,而不是寄存器。然而,请注意,在包括锁存器的设计中,时序分析要困难得多,因此通常应该避免它们。

最新更新