为仿真和综合定义不同的参数值
Defining different parameter value for simulation and synthesis
我正在使用 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 中可以使用类似的构造,并使用适当的 syntax/comment 变化。 Xilinx Vivado 使用 // 综合 translate_off 和 // 综合 translate_on
const logic IN_SIM = 1'b0
/*synthesis translate_off */
|| 1'b1
/*synthesis translate_on */
;
这种构造的优点是它不需要任何外部脚本更改。
我正在使用 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 中可以使用类似的构造,并使用适当的 syntax/comment 变化。 Xilinx Vivado 使用 // 综合 translate_off 和 // 综合 translate_on
const logic IN_SIM = 1'b0
/*synthesis translate_off */
|| 1'b1
/*synthesis translate_on */
;
这种构造的优点是它不需要任何外部脚本更改。