2016-02-22 318 views
0

我在设计中使用时钟切换电路。这是细胞的行为模型。如何在verilog中将寄存器初始化为随机值?

module toggle (En, CP, Q); 
    input CP, En ; 
    output Q; 

    reg Q_int; 

`ifdef INIT 
    initial Q_int = 1'b0; 
`endif 

    always @ (posedge CP) begin 
    if (En) Q_int <= ~Q_int; 
    end 

    assign Q = Q_int; 

endmodule 

在我的模拟过程中,我正在使用ifdef将Q_int初始化为零。如果Q只是改变它的状态,那么它不会完全覆盖真实的行为,不管它从何处开始(0或1)。那么如何将Q_int初始化为ZERO或ONE以用于模拟目的。

如何在verilog或系统verilog中实现这样的Q_int = random(0或1)?

回答

2

一种方法是使用IEEE Std 1800-2012,第18.13.2节$urandom_range()函数。传递1的单个参数将随机返回0或1.当我将其他种子值传递给我的模拟器命令(VCS或Incisive)时,我会得到分配给Q_int的随机初始值。

module toggle (En, CP, Q); 
    input CP, En ; 
    output Q; 

    reg Q_int; 

    initial Q_int = $urandom_range(1); 

    always @ (posedge CP) begin 
    if (En) Q_int <= ~Q_int; 
    end 

    assign Q = Q_int; 

endmodule 
+0

感谢您的建议。 $ urandom_range(1)vs just $ random有什么区别?对于这种情况,他们都会有相同的效果? –

+0

不客气。当你尝试时会发生什么?你可以在同一个文档中阅读$ random。 – toolic

0

您也可以在万一你想通过输入相同的种子值重现相同的输出,你可以使用

$random(seed_value) % 2... 

的种子值是非常重要的。

0

你的代码似乎很好,它应该将Q_int初始化为0,但要确保你在命令行中传递了“INIT”。

+0

这是如何回答初始化为随机值的主要问题?这应该是一个评论,而不是一个答案。 – toolic

+0

是的,它的工具应该是评论而不是回答,但根据堆栈溢出规则,只有50分的人可以评论任何人的问题或答案。关于问题,据我从问题和代码的意图了解,这个人在初始化Q_int时遇到了问题,所以我相应地回答了这个问题。 –

+0

这里的要点是,无论提到的原始代码是否适合我,它应该可以工作,但由于某种原因,它不起作用,无法初始化变量Q_int。另外,在问题的最后部分,人们问'那么我怎么能将Q_int初始化为零或一个以用于模拟目的。所以这个说法表明这个人在初始化变量时遇到了麻烦。我只是表达了我的想法,他/她可能会错过。是的,最初我试图评论它,但无法做到,所以我回答了这个问题。 –

0

您的代码看起来简单,

module toggle (En, CP, Q); 
    input CP, En ; 
    output Q; 

    reg Q_int; 

    // initial Q_int = $urandom_range(1,0); 

    // initial Q_int = $random(); 

    always @ (posedge CP) begin 
    if (En) Q_int <= ~Q_int; 
    end 

    assign Q = Q_int; 

endmodule 

两个注释语句可以使用。 $ random将根据种子值从系统的RNG生成32位值,因为您的RHS是1位,它只分配LSB,在$ urandom_range的情况下,它将只生成指定范围内的随机数,0到1 ,这也取决于种子价值。