Как изменить структуру, проходящую через порт в системном Verilog - генерировать не работает - PullRequest
0 голосов
/ 03 сентября 2018
module testy
    #(
        parameter W = 10,
        parameter C = 2
     )
     (
         aa
     );

   generate
      if (W == 8)
        begin:W8
           if(C == 1)
                begin:W8C1
                typedef struct {
                   logic [8:0] so;
                }my_struct;

                end 
           if(C == 2)
             begin:W8C2
                typedef struct {
                   logic [10:0] so;
                }my_struct;
             end
        end
   endgenerate

input my_struct aa;

endmodule

Я получаю эту ошибку:

irun(64): 14.20-p001: (c) Copyright 1995-2015 Cadence Design Systems, Inc.
file: testy.v
input my_struct aa;
              |
ncvlog: *E,SVNOTY (testy.v,30|14): Syntactically this identifier appears to begin a datatype but it does not refer to a visible datatype in the current scope.
    module worklib.testy:v
        errors: 1, warnings: 0
ncvlog: *F,NOTOPL: no top-level unit found, must have recursive instances.
irun: *E,VLGERR: An error occurred during parsing.  Review the log file for errors with the code *E and fix those identified problems to proceed.  Exiting with code (status 2).

Я думал, что генерации были статически определены, но у меня проблемы с его компиляцией - поскольку параметры не могут быть переопределены в пакетах, и я не мог придумать способ сделать это в дизайне, который должен быть синтезирован и не хотел добавлять интерфейсы или классы. Есть ли лучший способ сделать это. Моя структура содержит более 100 записей, если я включаю все комбинации и использую только то, что хочу, но я подумал, что с помощью функции Generate я могу обрезать ее до того, что я хочу, основываясь на наборе параметров.

Спасибо

1 Ответ

0 голосов
/ 03 сентября 2018

Ваша проблема в том, что область действия typedef является локальной для блоков внутри ваших операторов generate. Если все, что вам нужно сделать, это изменить размер типа данных, вы можете использовать постоянный вызов функции, который определяется статически. Но затем вы сталкиваетесь с другой проблемой с вашим распакованным объявлением структуры - оно все еще локально для модуля, и вы не сможете подключить к нему другую структуру с соответствующим типом данных. Интерфейс будет лучшим решением и может быть синтезирован.

Другая возможность - передать параметр типа.

...