为仿真和综合定义不同的参数值

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 */
    ;

这种构造的优点是它不需要任何外部脚本更改。