2016-08-24 95 views
4

我对FPGA相对较新,我正在寻找关于Verilog中声明模块的现代最佳实践的一些指导。verilog模块声明的首选语法

我看到了两种在Verilog中声明模块的方法。首先让我想起Traditional C,如examples on wikipedia

module toplevel(clock,reset); 
    input clock; 
    input reset; 

    /* snip */ 
endmodule 

尽管替代语法具有输入/输出符作为参数列表,而不是太不相似的VHDL的一部分,如this example

module fadder(
    input a,   //data in a 
    input b,   //data in b 
    input cin,  //carry in 
    output sum_out, //sum output 
    output c_out  //carry output 
); 

/* snip */ 
endmodule 

对于新编写的verilog代码,哪种语法是首选的?在这种情况下,“首选”是指用标准或相关材料写的东西(明确书写或通过标准中给出的示例隐式写入)或写入广受好评的样式指南。问题不在于要求个人偏好!

回答

6

第二个语法形式被缩进以替换第一个语法形式。如果您查看1364-2001 Verlog LRM以及当前的1800-2012 SystemVerilog LRM,您会注意到模块声明的所有示例均使用第二种形式。第一种形式仅用于遗产,但不幸的是,教科书和课程材料的转换时间长于预期。

这种新的(或ANSI风格)语法的关键好处是你只需要在一个地方声明你的端口名称。使用较旧的语法,您必须声明端口名称三次;一次用于位置排序,另一次用于端口方向,并且如果端口需要不是有线的,则第三次声明其数据类型。

+2

由于解释理由,接受这一点。感谢这两个答案。 – Damien

6

第二个是优选的。这是在Verilog 2001中引入的。这通常被称为“ANSI风格”。

当我教Verilog时,我教导了两者,但对所有新代码都推荐使用ANSI风格。 (并提及我只教第一种风格,以便学生能够理解遗留代码。)

如果你进入System-Verilog,你会发现有些东西只能用ANSI风格工作。

+0

的SystemVerilog不支持非ANSI;参见[IEEE标准1800 -2012](http://standards.ieee.org/getieee/1800/download/1800-2012.pdf)§23.2.2.1。ANSI是首选格式 – Greg

+2

@Greg,马修传达的是,有一些新的SystemVerilog仅适用于ANSI风格的端口,例如,您不能使用非ANSI风格的端口定义通用的'interface'端口 - 因为LRM仅使用ANSI风格的端口为该功能创建了合成器。 –

+0

@ dave_59,I当我第一次阅读时,想念我读了最后一行,我也忽略了非ANSI的细节不支持像通用接口这样的功能。 – Greg

0

第二种模式是首选,但有些情况下您可能需要使用第一种模式。这是如果你有很多复杂的计算需要完成参数才能达到正确的端口宽度。下面只是一个小例子。是的,您可以用它们的表达式替换localparam,但这可能会使您的代码无法读取。
我认为这是(系统)的Verilog遗漏,你不能以#(参数..定义后使用local_param之一

module example 
#(parameter  
    L2DEPTH = 8, 
    OFFSET = 2 
) 
(siga,sigb,sigc,sig_out); 
localparam DEPTH = 1<<L2DEPTH; 
localparan TOP = DEPTH+OFFSET; 
localparam BOT = DEPTH-OFFSET; 
localparam DBLDEPTH = 2<<L2DEPTH;; 
input [ L2DEPT-1:0] siga; 
input [  TOP-1:0] sigb; 
input [  BOT-1:0] sigc; 
output [DBLDEPTH-1:0] sig_out;