Привет, почему симуляция 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
не