- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Verilog-2001新增特性
标签: HYPERLINK /Lael/FPGA.aspx \o FPGA FPGA?? HYPERLINK /Lael/Verilog.aspx \o Verilog Verilog??
HYPERLINK /chactor/190233/message.aspx \l # 【原创】Verilog-2001新增特性(实例分析)
?????? Verilog-2001标准在2001年就发布了,不过翻了一些Verilog书籍,对Verilog-2001的新增特性很少有提及,即使提到了,也只是寥寥数语带过,其实在Verilog-2001中做了很多有用的改进,给编程带来很大的帮助,有必要详细了解。
?????? 在Quartus II软件中现在支持的Verilog标准有三类,即Verilog-1995,Verilog-2001,以及SystemVerilog-2005.具体用那种标准进行编译综合,需要在设置对话框中进行设置,如下图所示:
?????? 下面对Verilog-2001新增特性进行详细说明,部分说明用实例进行解析。
????????? generate语句
Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variale,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。
为此,Verilog-2001还增加了以下关键字:generate,endgenerate,genvar,localparam。genvar为新增数据类型,存储正的integer。在generate语句中使用的index必须定义成genvar类型。localparam与parameter有些类似,不过其不能通过redefinition改变值。除了可以在generate语句中使用if-else,case外,还能使用for语句进行循环。
下面是一个使用generate的例子,根据a_width和_width的不同,实例化不同的multiplier。
module multiplier (a, , product);
parameter a_width = 8, _width = 8;
localparam product_width = a_width+_width;
input [a_width-1:0] a;
input [_width-1:0] ;
output[product_width-1:0]product;
generate
if((a_width 8) || (_width 8))
CLA_multiplier #(a_width, _width)
u1 (a, , product);
else
WALLACE_multiplier #(a_width, _width)
u1 (a, , product);
endgenerate
endmodule
在下面的例子中,在generate语句中使用了for语句。
module Nit_adder (co, sum, a, , ci);
parameter SIZE = 4;
output [SIZE-1:0] sum;
output co;
input [SIZE-1:0] a, ;
input ci;
wire [SIZE:0] c;
genvar i;
assign c[0] = ci;
assign co = c[SIZE];
generate
for(i=0; iSIZE; i=i+1)
egin:addit
wire n1,n2,n3; //internal nets
xor g1 ( n1, a[i], [i]);
xor g2 (sum[i],n1, c[i]);
and g3 ( n2, a[i], [i]);
and g4 ( n3, n1, c[i]);
or g5 (c[i+1],n2, n3);
end
endgenerate
endmodule
generate执行过程中,每一个generated net在每次循环中有唯一的名字,比如n1在4次循环中会产生如下名字:
addit[0].n1
addit[1].n1
addit[2].n1
addit[3].n1
这也是为什么在egin-end块语句需要名字的一个原因。同样,实例化的module,gate等在每次循环中也有不同的名字。
addit[0].g1
addit[1].g1
addit[2].g1
addit[3].g1
????????? constant functions
Ve
原创力文档


文档评论(0)