嗨,为什么 VCS 模拟允许来自 2 个不同的总是块的一些分配,而对于其他一些则不允许
在下面的代码中:使用变量进行编译pass_val
但没有rollover_n
编译和运行代码似乎很好。没有任何问题
但是,当我rollover_n
在下面的代码中看到时,我得到编译器错误“程序驱动程序的非法组合”,指向rollover_n
分配在 2 个不同的始终块中。
这两个都在 2 个不同的 always 块中分配了值,但是rollover_n
会收到错误消息,while是允许的pass_val
rollover_n
pass_val
这是伪代码:
input power
input[47:0] input_array
logic [11:0] slice[3:0]
logic [11:0] moving_comparator
logic [11:0] pass_val
initial
slice[3:0] = {0,0,0,0};
moving_comparator = 0;
pass_val = 0;:
//bit slicing block
always_comb begin
if(enable[0]==1 && power==1)
slice[0] = input_array[11:0];
else if (power==0)
slice[0] = 0;
if(enable[1]==1 && power==1)
slice[1] = input_array[23:12];
else if (power==0)
slice[1] = 0;
if(enable[2]==1 && power==1)
slice[2] = input_array[35:24];
else if (power==0)
slice[2] = 0;
if(enable[3]==1 && power==1)
slice[3] = input_array[47:36];
else if (power==0)
slice[3] = 0;
foreach(slice[i])begin
if(moving_comparator<slice[i] && power==1)moving_comparator = slice[i];
else if (power==0) moving_comparator = 0;
end
pass_val = moving_comparator;
if(pass_val == 0 && ((|enable) == 1)) rollover_n = 1;//~(|moving_comparator) ;// just to trigger the arbitration block in case assignment to pass_val is actually 0
else seqnum_rollover_n = 0;
foreach(slice[i])begin //IMPORTANT!! make sure moving comparator dont compare with stale values from prev selects
slice[i] = 0;
end
moving_comparator = 0;
end
//arbitration block
always @(pass_val,compare,rollover_n) begin
if(pass_val>compare)begin output=pass_val;
pass_val = 0;
end
else begin
output=compare;
end
if(rollover_n) begin
rollover_n = 0;
end
end
那么,为什么pass_val
允许在
always @(pass_val,compare,rollover_n)
always_comb
但rollover_n
不是_