Verilog 为模拟和合成定义不同的参数值
我使用的是systemVerilog,我有一个包,其中保存了我的一些模块参数值(例如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
参数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的方法论决策很糟糕。在任何情况下使用合成指令都是一种糟糕的方法。在你的情况下,这也是一种编程技巧。