嗨,为什么VCS模拟允许从2个不同的always块进行某些分配,而对于其他一些则不允许
在以下代码中:
在使用变量pass_val
进行编译但没有rollover_n
的情况下,代码的编译和运行似乎很好。没问题
但是,当我在下面的代码中看到引入rollover_n
时,出现编译器错误“过程驱动程序的非法组合”,指出rollover_n
被分配了2个不同的always块。
这两个rollover_n
和pass_val
都在2个不同的Always块中分配了值,但是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
不是
答案 0 :(得分:0)
我复制了代码并修复了某些错字(在输入定义中缺少分号,并将begin
/ end
添加到initial
块中。网。
解析设计文件“ test.sv”顶级模块: 测试未指定时间刻度
错误-[ICPD]驱动程序非法组合 test.sv,8
程序驱动程序的非法组合
变量“ pass_val”由无效的程序组合驱动 驱动程序。无法写在“ always_comb”左侧的变量
到任何其他进程,包括其他“ always_comb”进程。
该变量在“ test.sv”处声明,8:逻辑[11:0] pass_val;
第一个驱动程序位于“ test.sv”,60:pass_val = 0;
第二个驱动程序位于“ test.sv”,25:if((enable [0] == 1'b1)&&(power == 1'b1))always_comb开始 开始...错误-[ICPD]驱动程序非法组合 test.sv,13 程序驱动程序的非法组合
变量“ rollover_n”由无效的程序组合驱动 驱动程序。不能写在“ always_comb”左侧的变量
由任何其他进程(包括其他“ always_comb”进程)进行。 此变量在“ test.sv”处声明:13:逻辑rollover_n;
第一个驱动程序位于“ test.sv”,67:rollover_n = 0;
第二个驱动程序位于“ test.sv”,25:if((enable [0] == 1'b1)&&(power == 1'b1))always_comb开始 开始...2个错误的CPU时间:0.066秒进行编译