Verilog中的“模板”和详细说明?

时间:2012-02-19 18:50:39

标签: templates parameters verilog

我正在阅读并试图理解一些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中有哪些模板/做的解释,也许是对我在这种情况下对'阐述'的理解的修正 - 谢谢!

2 个答案:

答案 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只对综合工具有意义;它不会影响模拟。