我正在阅读并试图理解一些verilog,并且通过编译器指令:
// synopsys template
但我不知道这是什么或它做了什么。我的Google Fu在研究“verilog模板”的变体时导致了更多的verilog代码示例而不是答案。
我确实找到了这个概要用户指南:http://acms.ucsd.edu/info/documents/dc/syn3.pdf,在p282上提供了一些信息,该指令似乎影响了这个变量:
hdlin_auto_save_templates
Controls whether HDL designs containing parameters are read in as templates.
...
它继续暗示这个指令会影响“详细说明”(也许会延迟它?到底是什么?),当我将当前的理解与传统编译的代码发射步骤松散地类似时,将verilog转换为“实际” “硬件代表?
我很感激Verilog中有哪些模板/做的解释,也许是对我在这种情况下对'阐述'的理解的修正 - 谢谢!
答案 0 :(得分:3)
它继续暗示这个指令会影响“阐述”(或许会延迟它? 结束?),我目前的理解与代码类似 传统编译的发射步骤,当verilog是 转换为“实际”硬件表示?
不是真的。精化是语言规范的一部分,是处理设计的必要步骤。处理Verilog通常需要两个不同的步骤,规范描述为解析和精化。 SystemVerilog更精确地定义了这些并调用它们编译和精化。
1364年至2005年: 精化是解析和模拟之间发生的过程。 它将模块绑定到模块实例,构建模型层次结构, 计算参数值,解析分层名称,建立 net connectivit,并准备所有这些用于模拟。随着 添加生成结构,这些任务发生的顺序 变得重要。
Verilog包含一些构造,使得无法完全构建模块,然后将其“链接”到更大的设计。请考虑以下代码:
module mod1 #(parameter WIDTH = 0) (output [WIDTH:0] port1);
generate
if(WIDTH > 3)
assign port1 = {WIDTH{1'b1}};
else
assign port1 = {WIDTH{1'b0}};
endgenerate
endmodule
当读取上述模块时,解析器不知道WIDTH将是什么,因为在实例化中可以覆盖给定的值。这可以防止它解析生成块内的代码,直到读取整个Verilog源文本。使用defparams,函数的前向声明和分层引用会变得更加复杂。
命令// synopsys template
和术语“模板”不是verilog的一部分。给定工具的答案和您链接的文档,它似乎告诉工具在命令之后读取的任何模块都需要参数定义,因此在读取时不应详细说明。例如,网表在实例化中不会有任何参数覆盖,因此如果要将RTL实例放在网表中,则需要直接告诉综合工具参数应该是什么。
答案 1 :(得分:1)
当将Verilog RTL代码合成到门网表中时,Synopsys设计编译器工具使用// synopsys template
注释。该编译指示仅影响包含parameters
的Verilog代码。它在合成同一个Verilog模块的多个实例时特别有用,每个实例都有不同的传递参数值。
例如,如果您有一个使用parameter
指定其字深的FIFO:
parameter DEPTH = 4;
如果需要,您可以合成两个FIFO,覆盖默认深度。
使用template
pragma还允许使用其他Design Compiler脚本变量控制合成的实例名称。
template
pragma只对综合工具有意义;它不会影响模拟。