Макросы для упаковки и распаковки трехмерных массивов в Verilog - PullRequest
0 голосов
/ 19 января 2019

Я новичок в Verilog, хочу упаковать и распаковать трехмерные входы и выходы в коде, для которого я определил два макроса, как показано ниже:

`define PACK_3D(PK_WIDTH,PK_HEIGHT, PK_DEPTH, PK_SRC, PK_DEST) \
genvar pk_idh; \
genvar pk_idd; \
generate for (pk_idd=0; pk_idd<(PK_DEPTH); pk_idd=pk_idd+1) begin \
  generate for (pk_idh=0; pk_idh<(PK_HEIGHT); pk_idh=pk_idh+1) begin \
      assign PK_DEST[pk_idd*(PK_HEIGHT*PK_WIDTH) + pk_idh*(PK_WIDTH) + (PK_WIDTH-1): pk_idd*(PK_HEIGHT*PK_WIDTH) + pk_idh*(PK_WIDTH)] = PK_SRC[pk_idd][pk_idh][(PK_WIDTH)-1):0]; \
  end \
endgenerate \
end \
endgenerate



`define UNPACK_3D(PK_WIDTH, PK_HEIGHT, PK_DEPTH, PK_SRC, PK_DEST) \
genvar pk_idh; \
genvar pk_idd; \
generate for (pk_idd=0; pk_idd<(PK_DEPTH); pk_idd=pk_idd+1) begin \
  generate for (pk_idh=0; pk_idh<(PK_HEIGHT); pk_idh=pk_idh+1) begin \
    assign PK_DEST[pk_idd][pk_idh][(PK_WIDTH)-1):0] = PK_SRC[pk_idd*(PK_HEIGHT*PK_WIDTH) + pk_idh*(PK_WIDTH) + (PK_WIDTH-1): pk_idd*(PK_HEIGHT*PK_WIDTH) + pk_idh*(PK_WIDTH)]; \
  end \
  endgenerate \
end \
endgenerate

Далее я построил модуль добавления, чтобы добавить две трехмерные матрицы и вернуть вывод, как показано ниже:

module add(clk, rst, g_input, e_input, o);
input clk,rst;   
localparam num=4;  
localparam h = 3;
localparam w = 3;
localparam d = 2;

input [2*num*h*w*d-1:0] g_input; 
input [2*num*h*w*d-1:0] e_input;  
output reg [2*num*h*w*d-1:0] o;

reg [2*num -1: 0] g_unpack[d-1:0][h-1:0][w-1:0];
reg [2*num -1: 0] e_unpack[d-1:0][h-1:0][w-1:0];
reg [2*num -1: 0] o_unpack[d-1:0][h-1:0][w-1:0];


`UNPACK_3D(w,h,d,g_input,g_unpack);
`UNPACK_3D(w,h,d,e_input,e_unpack);

integer i_d, i_h, i_w 

always@*   // always combinational block
  begin
    for (i_d = 0; i_d < d; i_d = i_d+1)
      begin
      for (i_h = 0; i_h < d; i_h = i_h+1)
        begin
        for (i_w = 0; i_w < d; i_w = i_w+1)
          begin
            o_unpack[i_d][i_h][i_w] = g_unpack[i_d][i_h][i_w] + e_unpack[i_d][i_h][i_w];
          end
        end
      end
  end

`PACK_3D(w,h,d,o_unpack,o);
endmodule

Я получил идею из этого обсуждения . Хотя я, когда я пытаюсь скомпилировать код выше, я получаю ошибку компиляции:

Error:  ./add.v:43: Syntax error at or near token 'generate'
    in macro "UNPACK_3D"
    called from file "./add.v" (line 43). (VER-294)
Error:  ./add.v:43: Syntax error at or near token '('
    in macro "UNPACK_3D"
    called from file "./add.v" (line 43). (VER-294)
Error:  ./add.v:44: Syntax error at or near token 'generate'
    in macro "UNPACK_3D"
    called from file "./add.v" (line 44). (VER-294)
Error:  ./add.v:44: Syntax error at or near token '('
    in macro "UNPACK_3D"
    called from file "./add.v" (line 44). (VER-294)
Error:  ./add.v:44: Syntax error at or near token '('
    in macro "UNPACK_3D"
    called from file "./add.v" (line 44). (VER-294)
Error:  ./add.v:48: Syntax error at or near token 'always'. (VER-294)
Error:  ./add.v:50: Syntax error at or near token ';'. (VER-294)
Error:  ./add.v:52: Syntax error at or near token ';'. (VER-294)
Error:  ./add.v:54: Syntax error at or near token ';'. (VER-294)
Error:  ./add.v:62: Syntax error at or near token 'generate'
    in macro "PACK_3D"
    called from file "./add.v" (line 62). (VER-294)
Error:  ./add.v:62: Syntax error at or near token '('
    in macro "PACK_3D"
    called from file "./add.v" (line 62). (VER-294)
Error:  ./add.v:62: Syntax error at or near token '('
    in macro "PACK_3D"
    called from file "./add.v" (line 62). (VER-294)
*** Presto compilation terminated with 12 errors. ***

Может кто-нибудь помочь решить эту проблему? Спасибо.

1 Ответ

0 голосов
/ 19 января 2019

Вы вложили свой generates.

У вас должна быть только одна пара generate..endgenerate с обоими циклами for внутри.

Также, если вы создаете экземпляр этого кода, ваши genvars объявляются дважды (genvar pk_idh; genvar pk_idd;), даже если вы их делаетеВ разных пакетах и ​​пакетах вы можете вызывать каждый макрос только один раз.

Я бы также рекомендовал сначала попробовать код без макросов.Затем, когда синтаксис правильный и код работает, попытайтесь преобразовать его в макрос.

...