Как использовать const в Verilog
-
27-10-2019 - |
Вопрос
Вместо использования
module ... ( .. ) ;
#15
endmodule
Я хочу использовать
module ... ( ... ) ;
// GateDelay is a const, like in c language const int GateDelay = 15 ;
# GateDelay
endmodule
Или то же самое
module ... ( ... ) ;
// assume Wordsize is defined at " define Wordsize 15 "
reg [ Wordsize -1 : 0 ] mem ;
endmodule
Могу ли я сделать это желание в Verilog?
Решение
У вас есть несколько вариантов:
- Макросы с
`define
с parameter
сlocalparam
с
Вот небольшой пример со всеми.
`define CONSTANT_MACRO 1 /* important: no ';' here */
module mymodule
#( parameter WIDTH = 5 )
(
input wire [WIDTH-1:0] in_a,
output wire [WIDTH-1:0] out_a
);
localparam CONSTANT_LOCAL = 2;
assign out_a = in_a + `CONSTANT_MACRO - CONSTANT_LOCAL;
endmodule
Другие советы
Для перечисленных вами случаев я бы порекомендовал параметры.
Как и Директива CSOMPLIER C, «DEFINE является глобальным для компиляции. Если ваш код когда -либо будет использоваться с кодом, вы не контролируете, вам нужно быть осторожным здесь.
Параметры всегда являются локальными для объема модуля, поэтому идентично названные параметры в различных элементах дизайна не будут конфликтовать друг с другом. У них также есть то преимущество, что они могут быть отменены на основе каждого.
module #(parameter DATA_WIDTH = 1) busSlave(
input [DATA_WIDTH-1:0] bus_data,
input bus_wr,
...
);
endmodule
module top;
//DATA_WIDTH is 32 in this instance
busSlave #(.DATA_WIDTH(32)) slave32(
.bus_data(data_0),
.bus_wr(wr_0),
...
);
//DATA_WIDTH is 64 in this instance
busSlave #(.DATA_WIDTH(64)) slave64(
.bus_data(data_1),
.bus_wr(wr_1),
...
);
endmodule
Не связан с StackOverflow