NBA能否在for循环中将$ urandom分配给未打包的变量数组?
module tb();
logic clk [2];
initial clk[0] = 0;
always clk[0] = #1ns !clk[0];
for (genvar i = 1; i < 2; i++)
assign #(1ns/2) clk[i] = clk[i-1];
int tmp [2] [8];
always @ (posedge clk[0]) begin
foreach (tmp[0][i]) begin
/*int m;
m = $urandom(); // SECTION 1 - using this code works (commenting out SECTION 2)
tmp[0][i] <= m;*/
tmp[0][i] <= $urandom(); // SECTION 2
end
#1ns;
foreach (tmp[0][i]) begin
$display("%1d", tmp[0][i]);
end
$finish();
end
for (genvar i = 1; i < 2; i++) begin
always_ff @ (posedge clk[i]) begin
tmp[i] <= tmp[i-1]; // SECTION 3 (just removing this works too)
end
end
endmodule
使用Cadence工具(xrun 17.09-v002),我为所有8个tmp [0] int分配了相同的值。
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
有人可以确认此代码是否合法?
我已经与Cadence交谈,并被告知: 研发的回应。
这种在非阻塞分配中进行$ urandom调用的使用模型是错误的。 System Verilog的调度语义要求RHS在“非活动区域”中进行一次计算和采样,然后在“ NBA区域”中同时分配foreach的所有元素!
答案 0 :(得分:0)
在过程循环中调用$urandom
与多次串行调用$urandom
并无区别。您的代码可以通过多种工具提供理想的结果,包括EDAPlayground.com上的Cadence。也许您没有展示是您的问题的一部分。总是有助于显示MCVE,例如
module top;
int tmp [2] [8];
bit clk;
initial begin
#1 clk=1;
#1 $display("%p",
tmp[0]);
end
always @ (posedge clk) begin
foreach (tmp[,i]) begin
tmp[0][i] <= $urandom();
end
end
endmodule