搞定Verilog中的generate ,参数传递,for的用法
0赞新工作第一天,看了看别人的代码,发现自己对于Verilog语言还是有很多不清晰的地方,谨以此篇博客。希望自己能够搞清楚一些不清晰地东西。即使将来忘了回过头来再看看也能够马上回忆起来。废话结束。上正文。
Verilog-1995 支持通过以声明实例数组的形式对primitive和module进行复制结构建模。而在Verilog-2001里,新增加的generate语句拓展了这种用法(其思想来源于VHDL语言)。除了允许复制产生primitive和module的多个实例化,同时也可以复制产生多个net、reg、parameter、assign、always、initial、task、function。
在generate中引入了一种新的变量类型:genvar,用以在generate-for语句中声明一个正整数的索引变量(如果将“X”或“Z”或者“负值”赋给genvar 变量,将会出错)。genvar 变量可以声明在generate语句内,也可以声明在generate语句外。 (摘自百度文库,对于对于这些语言的标准我觉得没必要去细究,知道用法就行了)
generate语句有generate-for、genreate-if和generate-case三种语句。由于我遇到的常用的就是generate-for语句,这里我就记下generate-for语句的用法。
exp1:
module gray2bin2 (bin, gray);
parameter SIZE = 8; // this module is parameterizable output [SIZE-1:0] bin;
input [SIZE-1:0] gray;
reg [SIZE-1:0] bin;
genvar i;
generate
for(i=0; i
always @(gray[SIZE-1:i]) // fixed part select
bin[i] = ^gray[SIZE-1:i];
end
endgenerate
endmodule 等同于下面的语句:
always @(gray[SIZE-1:0]) // fixed part select
bin[0] = ^gray[SIZE-1:0];
always @(gray[SIZE-1:1]) // fixed part select
bin[1] = ^gray[SIZE-1:1];
always @(gray[SIZE-1:2]) // fixed part select
bin[2] = ^gray[SIZE-1:2];
always @(gray[SIZE-1:3]) // fixed part select
bin[3] = ^gray[SIZE-1:3];
always @(gray[SIZE-1:4]) // fixed part select
bin[4] = ^gray[SIZE-1:4];
always @(gray[SIZE-1:5]) // fixed part select
bin[5] = ^gray[SIZE-1:5];
always @(gray[SIZE-1:6]) // fixed part select
bin[6] = ^gray[SIZE-1:6];
always @(gray[SIZE-1:7]) // fixed part select
bin[7] = ^gray[SIZE-1:7];
此例程中用到的是always语句,generate-for语句起到的作用很明显,就是代码的复制,也可以说是逻辑的复制。
exp2:多层generate语句所复制产生的实例命名方式;
parameter SIZE = 2; genvar i, j, k, m; begin: B1// scope B1[i] for(j=0; j begin: B3// scope B1[i].B2[j].B3[k] end end end 在这里大家需要注意的就是实例产生后的名称。第一级循环在最前,然后依次往后排列就行了。 明天了将参数传递的用法看一下后补上。
generate
for(i=0; i
M1 N1();// instantiates B1[i].N1
M2 N2();// instantiates B1[i].B2[j].N2
for(k=0; k
M3 N3();// instantiates B1[i].B2[j].B3[k].N3
if(i>0)
for(m=0; m
M4 N4();// instantiates B1[i].B4[m].N4
end
endgenerate
下面是复制产生的实例名称的几个例子: B1[0].N1 B1[1].N1
B1[0].B2[0].N2 B1[0].B2[1].N2
B1[0].B2[0].B3[0].N3 B1[0].B2[0].B3[1].N3 B1[0].B2[1].B3[0].N3
B1[1].B4[0].N4 B1[1].B4[1].N4