Verilog 为模拟和合成定义不同的参数值

Verilog 为模拟和合成定义不同的参数值,verilog,system-verilog,modelsim,synplify,Verilog,System Verilog,Modelsim,Synplify,我使用的是systemVerilog,我有一个包,其中保存了我的一些模块参数值(例如参数SPI\u RATE=2\u 000\u 000;)。我有没有办法为模拟设置一个值,为合成设置另一个值?(我正在使用ModelSim)。 例如,我想要如下内容: if(IN_SIM) begin parameter SPI_RATE = 2_000_000; end else begin parameter SPI_RATE = 1_000_000; end 谢谢 是的,这是可能的。SystemVerilo

我使用的是systemVerilog,我有一个包,其中保存了我的一些模块参数值(例如
参数SPI\u RATE=2\u 000\u 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\u off*/*synthesis translate\u off*/来完成此操作,在VHDL中可以使用类似的结构,并进行适当的语法/注释更改。Xilinx Vivado使用//synthesis translate\u off和//synthesis translate\u on

const logic IN_SIM = 1'b0
/*synthesis translate_off */
    || 1'b1
/*synthesis translate_on */
    ;

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

您不是要用它进行验证/合成吗?听起来和我的意思一模一样!:)谢谢我在Synopsys synplify pro中搜索过一点,但没有发现类似的内容,你知道它在那里是如何命名的吗?请查看“Synopsys FPGA合成语言支持参考手册”并搜索“合成宏”。本手册说明Synplify Pro支持
合成
宏。应避免使用任何翻译指令。它会导致sim/synth不匹配。此外,此解决方案不适用于非0参数,只是一种攻击。@Serge你读过问题了吗?这就是重点,为了在模拟和合成中产生不同的行为,它可以用来产生你想要的任何数字,使用他的代码中使用的简单if-else OP是的,我做了。OP的方法论决策很糟糕。在任何情况下使用合成指令都是一种糟糕的方法。在你的情况下,这也是一种编程技巧。