Verilog 基于clk不';不适用于随机数

Verilog 基于clk不';不适用于随机数,verilog,system-verilog,iverilog,Verilog,System Verilog,Iverilog,我正在编写代码,每当“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,

我正在编写代码,每当“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”值


如何修复此问题?

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


如果希望
z
在时钟处于高位时持续更新,则需要锁存器,而不是寄存器。然而,需要预先警告的是,在包含锁存器的设计中,定时分析要困难得多,因此通常应该避免使用锁存器。

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


如果希望
z
在时钟处于高位时持续更新,则需要锁存器,而不是寄存器。然而,需要预先警告的是,在包含锁存器的设计中,定时分析要困难得多,因此通常应该避免使用锁存器。

从您展示的输出行为来看

register #(32) mine(z, d, clk, enable);
是一组32个D型触发器,它给出了它的名称,并且您连接的信号的名称似乎也是如此。如果您提供了
register
的代码,那么回答您的问题会更容易

因此,如果
register
实际上是一组32个D型触发器,那么您不会期望
z
在时间6时发生变化。这不是任何类型的触发器的行为:触发器的输出只在时钟的一个(上升或下降)边缘变化

考虑到这些D型触发器在您开始此练习之前就已经存在,您似乎更改
D
太快了。您应该在每个时钟(
clk
)周期内更改一次,即每
#10
更改一次。换句话说,试着改变一下

#2 d = $random;


从您展示的输出的行为来看

register #(32) mine(z, d, clk, enable);
是一组32个D型触发器,它给出了它的名称,并且您连接的信号的名称似乎也是如此。如果您提供了
register
的代码,那么回答您的问题会更容易

因此,如果
register
实际上是一组32个D型触发器,那么您不会期望
z
在时间6时发生变化。这不是任何类型的触发器的行为:触发器的输出只在时钟的一个(上升或下降)边缘变化

考虑到这些D型触发器在您开始此练习之前就已经存在,您似乎更改
D
太快了。您应该在每个时钟(
clk
)周期内更改一次,即每
#10
更改一次。换句话说,试着改变一下

#2 d = $random;


@我认为问题出在我的代码中,因为寄存器并不是我所拥有的,所以,有点像是由Verilog系统提供的。所以我猜我的代码不适合正确使用寄存器。@toolic我认为问题在我的代码中,因为寄存器不是我所拥有的,所以,有点像是由Verilog系统提供的。因此,我想我的代码不适合正确使用register.stangely我没有任何用于register的源代码。(我在源代码的同一文件夹中也没有名为register.v的文件,也没有外部文件)它只是编译并运行,即使输出不是我想要的。@online.0227编译和运行模拟时使用的完整命令是什么?如果您是从GUI驱动它,那么该命令可能是模拟器输出中的第一件事。iverilog-o circuit lab9\u part2.v&&vvp circuit+enable=1I在linux系统的terminal@online.0227谢谢-不幸的是,它没有帮助。我希望它们可以作为某种指示,
register
的代码在命令中的位置。好吧,这几乎可以肯定是一组触发器,如果你没有写那段代码,这就是它的目的?您是否实例化了
寄存器
,或者它已经存在于文件
lab9\u part2.v
?stangely我没有任何用于寄存器的源代码。(我在源代码的同一文件夹中也没有名为register.v的文件,也没有外部文件)它只是编译并运行,即使输出不是我想要的。@online.0227编译和运行模拟时使用的完整命令是什么?如果您是从GUI驱动它,那么该命令可能是模拟器输出中的第一件事。iverilog-o circuit lab9\u part2.v&&vvp circuit+enable=1I在linux系统的terminal@online.0227谢谢-不幸的是,它没有帮助。我希望它们可以作为某种指示,
register
的代码在命令中的位置。好吧,这几乎可以肯定是一组触发器,如果你没有写那段代码,这就是它的目的?您是否实例化了
寄存器
,或者它已经存在于文件
lab9\u part2.v
中?