Использование assign внутри $ test $ plusargs в systemverilog - PullRequest
0 голосов
/ 11 июля 2020

В моем коде я хочу выполнить несколько соединений, используя оператор assign для всех моих тестов, кроме одного теста, для которого я добавил в свой список тестов аргумент времени выполнения «HB_CONN_DISABLE». Когда я кодирую следующим образом, я получаю следующую ошибку

  if (!$test$plusargs("HB_CONN_DISABLE"))  
  begin
  assign iol.hb_valid_in = dp_if_tx_inject.hb_bar_val_in;
  assign iol.hb_in = dp_if_tx_inject.heartbeat_in;
  end

 Error-[V2KGEUV] Unknown or bad value for genvar
 -I-:/nfs/hd/disks/mgr_0240/...............soc_post.sv, 543
 Instance/Generate block name: iolc_tb
-I-:  Elaboration time unknown or bad value encountered for generate if-statement 
-I-:  condition expression.
-I-:  Please make sure it is elaboration time constant.

Я также пробовал что-то вроде ниже, но в этом случае он не распознает hb_bar_param в этой строке, если (hb_bar_param == 0) может быть потому, что к тому времени параметр не получает значение

  initial begin
  if ($test$plusargs("HB_BAR_TI_CONN_DISABLE"))  
  begin
  parameter hb_bar_param=1;
  end
  else
  begin
  parameter hb_bar_param=0;
  end
  end

 if(hb_bar_param==0)
 begin
 assign statements......
 end

Я также пробовал использовать assign с тернарным оператором, например, следующим

 assign iol.hb_valid_in = ($test$plusargs("...somthing..")) ? (... some value ...) : (... some other value ...);

, но в этом случае я все равно буду назначать что-то, если аргументы testplus ложны, но для меня требование состоит в том, что я не хочу назначать вообще, если есть аргументы testplus, пожалуйста, помогите мне с этой проблемой

В основном мне нужен следующий код для всех моих тесты, кроме одного теста, для которого я добавил аргументы testplus. Это незаконно или есть какой-либо способ сделать это.

 assign iol.hb_valid_in = dp_if_tx_inject.hb_bar_val_in;
 assign iol.hb_in = dp_if_tx_inject.heartbeat_in;

1 Ответ

0 голосов
/ 11 июля 2020

A parameter - это конструкция времени компиляции (времени разработки), которая определяется перед запуском программы.

Операторы if в вашем случае, которые являются членами первого ранга в коде модуля - это конструкция generate, которая также используется во время компиляции.

Plusargs передаются в уже скомпилированную модель при ее запуске, а $test$plusargs - это функция динамического c, выполняемая во время выполнения. Поэтому его нельзя использовать для изменения сгенерированной детали.

assign - это непрерывное присвоение, которое используется для назначения проводов. Следовательно, всегда нужно назначать lhs. Следовательно, вы не хотите назначать что-либо, использование этого оператора невозможно.

Однако, если вы объявите hb_valid_in как reg или logic, вы можете просто создать оператор защелки в следующее:

always @*
   if (!$test$plusargs("HB_CONN_DISABLE"))
      iol.hb_valid_in = some_value;

Таким образом, он присвоит 'some_value' переменной 'hb_valid_in', только если условие истинно. В противном случае этого не произойдет.

Все это сделано в предположении, что вы создаете несинтезируемый модуль испытательного стенда.

...