我对FPGA相对较新,我正在寻找关于Verilog中模块声明的现代最佳实践的一些指导.
我已经看到了两种在verilog中声明模块的方法.第一个让我想起了传统C,比如维基百科上的例子:
module toplevel(clock,reset);
input clock;
input reset;
/* snip */
endmodule
Run Code Online (Sandbox Code Playgroud)
替代语法将输入/输出说明符作为参数列表的一部分,而与VHDL不太相似,如下例所示:
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
Run Code Online (Sandbox Code Playgroud)
对于新编写的verilog代码,首选哪种语法?在这种情况下,"首选"是指用标准或相关材料(明确书写,或通过标准中给出的示例隐含)或用精心设计的样式指南书写的东西.问题不是要求个人偏好!
第二种语法形式缩进以替换第一种语法形式.如果您查看1364-2001 Verlog LRM以及当前的1800-2012 SystemVerilog LRM,您会注意到模块声明的所有示例都使用第二种形式.第一种形式仅用于遗产,但不幸的是,教科书和课程材料的转换时间比预期的要长.
这种较新(或ANSI风格)语法的主要优点是您只需在一个地方声明您的端口名称.使用较旧的语法,您必须声明端口名称最多三次; 一次用于位置排序,另一次用于端口方向,并且如果端口需要不是电线,则第三次声明其数据类型.
第二个是首选.这是在Verilog 2001中引入的.这通常被称为"ANSI风格".
当我教Verilog时,我教两者,但推荐ANSI样式的所有新代码.(并提到我只是教第一种风格,以便学生可以理解遗留代码.)
如果你继续使用System-Verilog,你会发现有些东西只能用ANSI风格.