搞定搞定Verilog中的中的generate ,参数传递,,参数传递,for的用法的用法
新工作第一天,看了看别人的代码,发现自己对于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<SIZE; i=i+1)
begin: bit
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];