Verilog: конкатенация определений приводит к ошибке компиляции

#concatenation #verilog

#конкатенация #verilog

Вопрос:

У меня странная ошибка в компиляции Verilog RTL. У меня есть 2 определения, и их объединение приводит к ошибке.

 `define ARRAY1 = 3'b001;
`define ARRAY2 = 3'b011;

[...]

next_state = {`ARRAY1,`ARRAY2};
  
 xmvlog: *E,ILLPRI (./../rtl/LVDS_ctrl_phy.v,271|37): illegal expression primary [4.2(IEEE)].
(`define macro: ARRAY1 [./../rtl/LVDS_ctrl_phy.v line 1], file: ./../rtl/LVDS_ctrl_phy.v line 271)
                 next_state = {`ARRAY1,`ARRAY2};
  

Поскольку define это просто подстановка текста, это не должно приводить к ошибке, верно?
Но, если я заменю соответствующим текстом

 next_state = {3'b001,3'b011};
  

это не приводит к ошибке.

У вас есть какие-либо идеи, почему это происходит?

Ответ №1:

Определение галочки похоже на поиск и замену в текстовом редакторе. Эти галочки определяют

 `define ARRAY1 = 3'b001;
`define ARRAY2 = 3'b011;
  

фактически означает

 replace all occurrences of `ARRAY1 with "= 3'b001;"
replace all occurrences of `ARRAY2 with "= 3'b021;"
  

итак

 next_state = {`ARRAY1,`ARRAY2};
  

становится

 next_state = {= 3'b001;,= 3'b021;};
  

что является бессмыслицей. В принципе, удалите точки с запятой и равные из этих строк:

 `define ARRAY1 3'b001
`define ARRAY2 3'b011
  

Комментарии:

1. Или используйте parameter ARRAY1 = 3'b001; parameter ARRAY2 = 3'b011; вместо