-1

嗨,为什么 VCS 模拟允许来自 2 个不同的总是块的一些分配,而对于其他一些则不允许

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

但是,当我rollover_n在下面的代码中看到时,我得到编译器错误“程序驱动程序的非法组合”,指向rollover_n分配在 2 个不同的始终块中。

这两个都在 2 个不同的 always 块中分配了值,但是rollover_n会收到错误消息,while是允许的pass_valrollover_npass_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_combrollover_n不是_

4

1 回答 1

0

我复制了您的代码并在修复了一些拼写错误的情况下运行它(输入定义中缺少分号并添加begin/endinitial块中。两个网络都出现错误。

解析设计文件“test.sv”顶级模块:测试未指定时间刻度

Error-[ICPD] Illegal combination of drivers test.sv, 8
Illegal combination of procedural drivers
变量“pass_val”是由一个无效的procedural driver组合驱动的 写入“always_comb”左侧的变量不能被
任何其他进程写入,包括其他“always_comb”进程。
此变量在“test.sv”中声明,8: logic [11:0] pass_val;
第一个驱动程序位于“test.sv”,60:pass_val = 0;
第二个驱动程序位于“test.sv”,25:always_comb begin if ((enable[0] == 1'b1) && (power == 1'b1)) begin ...

错误-[ICPD] Illegal combination of drivers test.sv, 13 Illegal combination of procedural drivers
变量“rollover_n”是由无效的procedural driver组合驱动的。写入“always_comb”左侧的变量不能被
任何其他进程写入,包括其他“always_comb”进程。此变量在“test.sv”中声明,13:逻辑翻转_n;
第一个驱动程序位于“test.sv”,67:rollover_n = 0;
第二个驱动程序位于“test.sv”,25:always_comb begin if ((enable[0] == 1'b1) && (power == 1'b1)) begin ...

2 个错误 CPU 时间:0.066 秒编译

于 2019-05-30T19:16:10.897 回答