为什么在verilog仿真中多个驱动程序会分配某些分配问题而不会分配其他分配

时间:2019-05-30 14:09:52

标签: verilog simulation system-verilog hdl synopsys-vcs

嗨,为什么VCS模拟允许从2个不同的always块进行某些分配,而对于其他一些则不允许

在以下代码中: 在使用变量pass_val进行编译但没有rollover_n的情况下,代码的编译和运行似乎很好。没问题

但是,当我在下面的代码中看到引入rollover_n时,出现编译器错误“过程驱动程序的非法组合”,指出rollover_n被分配了2个不同的always块。

这两个rollover_npass_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不是

1 个答案:

答案 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秒进行编译