NBA分配的$ urandom

时间:2018-07-13 01:10:47

标签: system-verilog

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的所有元素!

1 个答案:

答案 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