【问题标题】:Value changes based on clk doesn't work for random numbers基于 clk 的值更改不适用于随机数
【发布时间】:2016-03-22 20:03:09
【问题描述】:

每当“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”。

我该如何解决这个问题?

【问题讨论】:

  • @toolic 我认为问题出在我的代码内部,因为寄存器不是我所拥有的,因此,它有点由 Verilog 系统提供。因此我想我的代码不能很好地与 register 一起工作。

标签: verilog system-verilog iverilog


【解决方案1】:

从您提供的输出的行为看来

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;

【讨论】:

  • 奇怪的是我没有任何注册源代码。 (我在此源代码的同一文件夹中也没有名为 register.v 的文件,也没有在外部)它只是编译并运行,即使输出不是我想要的。
  • @online.0227 您用来编译和运行仿真的完整命令是什么?如果您是从 GUI 驱动它,那么该命令可能是模拟器输出中的第一件事。
  • iverilog -o 电路lab9_part2.v && vvp 电路+enable=1
  • 我在linux系统的终端上运行这个
  • @online.0227 谢谢 - 不幸的是,它没有帮助。我希望他们会在某种指示下register 的代码在命令中。好吧,几乎可以肯定它是一组触发器,并且鉴于您没有编写该代码,这就是预期的内容吗?你实例化了register 还是已经在文件lab9_part2.v 中了?
【解决方案2】:

您的收银机已经正常工作。寄存器是边沿触发的;在时间步长 5 和 6 之间没有时钟edge,所以z 的值没有更新。

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

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多