Использование структур SystemVerilog, которые содержат параметры в качестве портов ввода / вывода для модуля - PullRequest
0 голосов
/ 11 апреля 2019

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

Например:

`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,
);

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

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

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

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

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

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=%0d", 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
0 голосов
/ 11 апреля 2019

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

Вместо передачи списка значений параметров, передайте один struct 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 myStruct_t in_packet,
    output myStruct_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] myStruct_t 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;
...