System verilog NBA分配$urandom
$urandom可以在for循环中分配给未打包的变量数组吗System verilog NBA分配$urandom,system-verilog,System Verilog,$urandom可以在for循环中分配给未打包的变量数组吗 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 forea
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谈过了,他们告诉我:
研发部的回应
这种在非阻塞分配中调用$URADOM的使用模型是错误的。
系统Verilog的调度语义规定,RHS在“非活动区域”中计算和采样一次,然后在“NBA区域”中同时分配foreach的所有元素 在过程循环中调用
$urandom
与多次连续调用$urandom
没有区别。您的代码在几个工具中提供了所需的结果,包括edaplayder.com上的Cadence。也许你没有表现出来是你问题的一部分。表现出一种
模块顶部;
int tmp[2][8];
比特时钟;
初始开始
#1时钟=1;
#1$display(“%p”,
tmp[0]);
结束
始终@(posedge clk)开始
foreach(tmp[,i])开始
tmp[0][i]'系统Verilog的调度语义规定RHS在“非活动区域”中计算和采样一次'。这是真的吗?我认为RHS将在包含NBA的线路执行的任何区域(通常是活动区域)进行采样。我不知道他们在哪里提出了这一引用。我有一个小测试用例,显示了我认为Cadence工具中的一个bug。它以$urandom的NBA分配开始。他们给我们的回答是,NBA分配$urandom是错误的。我只是想弄清楚他们是否正确。今天晚些时候我将发布测试用例。
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
-2147414528
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