如何在verilog中将寄存器初始化为随机值?

时间:2016-02-22 19:20:35

标签: verilog system-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)这样的东西?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您也可以使用

 $random(seed_value) % 2...

种子值很重要,因为您希望通过输入相同的种子值来重现相同的输出。

答案 2 :(得分:0)

您的代码似乎很好,它应该将Q_int初始化为0,但要确保您正在传递&#34; INIT&#34;在命令行中。

答案 3 :(得分: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,它也取决于种子价值。