我正在使用 systemVerilog,并且我有一个包含我的一些模块参数值的包(例如parameter SPI_RATE = 2_000_000;
)。有什么方法可以为模拟设置一个值,为综合设置一个不同的值?(我正在使用 ModelSim)。例如,我想要类似的东西:
if(IN_SIM) begin
parameter SPI_RATE = 2_000_000;
end
else begin
parameter SPI_RATE = 1_000_000;
end
谢谢!
我正在使用 systemVerilog,并且我有一个包含我的一些模块参数值的包(例如parameter SPI_RATE = 2_000_000;
)。有什么方法可以为模拟设置一个值,为综合设置一个不同的值?(我正在使用 ModelSim)。例如,我想要类似的东西:
if(IN_SIM) begin
parameter SPI_RATE = 2_000_000;
end
else begin
parameter SPI_RATE = 1_000_000;
end
谢谢!
是的,这是可能的。SystemVerilog 支持条件编译器指令,例如`ifdef
、`ifndef
、`else
、`elsif
和`endif
. 请注意,这些指令使用重音符号(ASCII 0x60) 而不是普通的撇号 (ASCII 0x27)。
此外,大多数综合工具都支持宏标识符SYNTHESIS
。因此,您可以执行以下操作:
`ifdef SYNTHESIS
parameter SPI_RATE = 1_000_000;
`else
parameter SPI_RATE = 2_000_000;
`endif
是的。+define
您可以使用plusarg在任何模拟中从命令行设置宏,例如:
+define+SPI_RATE=2_000_000
然后在你的代码的某个地方,你可以说
parameter SPI_RATE = `SPI_RATE;
在您的合成器中将有一种设置宏值的机制:阅读合成器的说明。
使用 Synplify Pro,您可以使用 /*synthesis translate_off */ /*synthesis translate_off */ 来完成此操作,在 VHDL 中可以使用类似的结构,并进行适当的语法/注释更改。Xilinx Vivado 使用 // 综合 translate_off 和 // 综合 translate_on
const logic IN_SIM = 1'b0
/*synthesis translate_off */
|| 1'b1
/*synthesis translate_on */
;
这种结构的优点是它不需要任何外部脚本更改。