Cómo usar const en verilog
-
27-10-2019 - |
Pregunta
En lugar de usar
module ... ( .. ) ;
#15
endmodule
Quiero usar
module ... ( ... ) ;
// GateDelay is a const, like in c language const int GateDelay = 15 ;
# GateDelay
endmodule
O lo mismo
module ... ( ... ) ;
// assume Wordsize is defined at " define Wordsize 15 "
reg [ Wordsize -1 : 0 ] mem ;
endmodule
¿Puedo hacer ese deseo en Verilog?
Solución
Tienes algunas opciones:
- Macros con
`define
s parameter
slocalparam
s
Aquí hay un pequeño ejemplo con todos ellos.
`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
Otros consejos
Para los casos que enumeró, recomendaría parámetros.
Al igual que la Directiva del compilador C, `Definir es global para la compilación. Si su código alguna vez se utilizará con el código que no controle, deberá tener cuidado aquí.
Los parámetros siempre son locales para el alcance del módulo, por lo que los parámetros nombrados idénticamente en diferentes elementos de diseño no entrarán en conflicto entre sí. También tienen la ventaja de que pueden ser anulados por instancia.
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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow