Почему проблема с несколькими драйверами при некоторых заданиях, но не при других в симуляции verilog - PullRequest
0 голосов
/ 30 мая 2019

Привет, почему симуляция VCS допускает некоторые назначения из 2-х разных всегда блоков, в то время как для некоторых других это не разрешено

В коде ниже: При компиляции с переменной pass_val, но без rollover_n компиляция и запуск кода выглядит нормально. Нет проблем

Однако, когда я ввел rollover_n, как видно из приведенного ниже кода, я получаю ошибку компилятора «недопустимая комбинация процедурных драйверов», указывая, что rollover_n назначается в 2 разных всегда блоке.

Обе эти rollover_n и pass_val являются назначенными значениями в 2 различных всегда блоке, но 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 голосов
/ 30 мая 2019

Я скопировал ваш код и запустил его с некоторыми исправленными опечатками (пропуская точки с запятой в определениях входов и добавил блок begin / end в initial. Я получаю ошибку для обеих сетей.

Анализ файла проекта 'test.sv' Модули верхнего уровня: test Не указана шкала времени

Ошибка- [ICPD] Недопустимая комбинация драйверов test.sv, 8
Недопустимая комбинация процедурных драйверов
Переменная «pass_val» управляется недопустимой комбинацией процедурных драйверов. Переменные, записанные в левой части «always_comb», не могут быть записаны
никакими другими процессами, включаядругие процессы "always_comb".
Эта переменная объявлена ​​в "test.sv", 8: logic [11: 0] pass_val;
Первый драйвер находится в "test.sv", 60: pass_val = 0;
Второй драйвер находится на "test.sv", 25: всегда_комбинация начинается, если ((enable [0] == 1'b1) && (power == 1'b1)) begin ...

Ошибка- [ICPD] Недопустимая комбинация драйверов test.sv, 13 Недопустимая комбинация процедурных драйверов
Переменная "rollover_n" обусловлена ​​недопустимой комбинацией процедурных драйверов. Переменные, записанные в левой части "always_comb", не могут быть записаны
никакими другими процессами, включая другие процессы "Always_comb".Эта переменная объявлена ​​в "test.sv", 13: logic rollover_n;
Первый драйвер находится в "test.sv", 67: rollover_n = 0;
Второй драйвер находится в "test.sv",25: always_comb begin if ((enable [0] == 1'b1) && (power == 1'b1)) begin ...

2 ошибки Время ЦП: 0,066 секунды для компиляции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...