#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;