Использование структур SystemVerilog, содержащих параметры в качестве портов ввода / вывода в модуль

#struct #parameters #verilog #system-verilog

#структура #параметры #verilog #system-verilog

Вопрос:

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

Например:

 `ifdef MY_STRUCTS
`define MY_STRUCTS
typedef struct packed {
  logic [PARAMETER_VAL-1:0] field1;
  logic [PARAMETER1_VAL-1:0] field2;
} myStruct_t;
`endif

module top #(
  parameter PARAMETER_VAL = 8;
  parameter PARAMETER1_VAL = 16;
) (
  input myStruct_t in_packet,
  output myStruct_t out_packet,
);
  

К сожалению, это, похоже, проблема курицы или яйца. Определение структуры не может быть скомпилировано, поскольку оно зависит от параметров модуля для его определения. Однако объявления ввода / вывода не могут быть объявлены, поскольку они зависят от структуры, чтобы знать, что объявлять.

У кого-нибудь есть решение для этого? Определенно был бы признателен за предложения.

Ответ №1:

Потенциально вы также можете использовать параметризованный интерфейс.

Отказ от ответственности: следующий код работает с synopsys, но не работает с cadence в eda playground. Я думаю, что каденция здесь нарушает стандарт (возможно, они исправили это в последней версии).

В любом случае, вот пример

 interface top_if #(int PARAMETER_VAL = 8, PARAMETER1_VAL = 16) ();

   typedef struct packed {
      logic [PARAMETER_VAL-1:0] field1;
      logic [PARAMETER1_VAL-1:0] field2;
   } myStruct_t;

   myStruct_t in_packet, out_packet;

   modport in (input in_packet);
   modport out (output out_packet);

endinterface

module caller();
   top_if #(8,16) top_if();
   always_comb top_if.in_packet = '{11, 22};

   top top(top_if.in, top_if.out);

   logic [top_if.PARAMETER1_VAL-1:0] field2;
   always_comb field2 = top_if.out_packet.field2;
   always @* begin
      $display("out.field2=
", field2);
   end
endmodule


module top(
           top_if in,
           top_if out
           );
   logic [in.PARAMETER_VAL-1:0] field1;

   always_comb field1 = in.in_packet.field1;
   always_comb out.out_packet = '{field1, field1 55};

   always @* begin
      $display("input.field1=%d", field1);
   end

endmodule
  

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

1. Спасибо за это. К сожалению, наш набор инструментов не поддерживает интерфейсы SV в дизайне. Я бы хотел, чтобы это было так, как это было бы правильным способом сделать это….

2. Кроме того, как мне получить доступ к структурам, определенным в интерфейсе в логике модуля, если бы я использовал это?

3. вы имеете в виду как typedef для объявления в модуле? Я не думаю, что вы можете.

4. Хм, тогда это немного сбивает с толку. В идеале я хочу иметь возможность использовать ту же структуру для генерации, а также для отправки другим модулям. А также помещать их между ними. Структуры были идеальны для этого, за исключением этой проблемы с использованием параметров….

5. вы можете отправить весь интерфейс, как в примере. Вы можете получить доступ к полям структур и параметрам интерфейса.

Ответ №2:

Два варианта:

Вместо передачи списка значений параметров передайте единственную структуру typedef с нужной вам шириной поля. Вероятно, вы все равно захотите использовать структуру на верхнем уровне.

 module upper;
typedef struct packed {
  logic [7:0] field1;
  logic [16:0] field2;
} myStruct_t;
my_Struct in, out;
lower #(.T(my_Struct_t) ins1 (in, out);
...
endmodule
module lower #(type T) (
    input T in_packet,
    output T out_packet,
);
...
endmodule
  

Создайте тип структуры внутри модуля нижнего уровня, но сохраните порты в виде упакованных массивов. Это работает, потому что структура также упакована.

 module top #(
  parameter PARAMETER_VAL = 8;
  parameter PARAMETER1_VAL = 16;
) (
  input logic [PARAMETER_VAL PARAMETER_VAL1-1:0] in,
  output logic [PARAMETER_VAL PARAMETER_VAL1-1:0] out,
);

typedef struct packed {
  logic [PARAMETER_VAL-1:0] field1;
  logic [PARAMETER1_VAL-1:0] field2;
} myStruct_t;
 myStruct_t in_packet, out_packet;
assign in_packet = in;
assign out = out_packet;