我在设计中使用时钟切换电路。这是细胞的行为模型。
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)这样的东西?
答案 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,它也取决于种子价值。