Verilog中generate用法

代码中用到的代码是:

// byte wise data compare logic
genvar err_i;
generate for(err_i = 0; err_i < `DATA_WIDTH/8; err_i = err_i + 1)
begin: gen_err
always @ (posedge clk90) begin
byte_err_fall[err_i]
<= (read_data_reg[err_i*8+:8] !=
cmp_data[err_i
*8+:8]);

byte_err_rise[err_i]
<= (read_data_reg[`DATA_WIDTH+err_i*8+:8] !=
cmp_data[`DATA_WIDTH
+err_i*8+:8]);
end
end
endgenerate

generate可以用for,case,if。其中,generate实例化多个器件很简洁。相关注意事项住下

1,genvar后面的for,变量必须是genvar变量;generate+if,不如`ifdef `else `endif

2,for里必须有begin,哪怕只有一句

3,begin必须有名称,原因见4

4,这里例化的模块名称是inst[j].例化名

5,generate语句可以看作是标准化为块的综合指令

标准实例:

module Nbit_adder (co, sum, a, b, ci);
parameter SIZE = 4;
output [SIZE-1:0] sum;
output co;
input [SIZE-1:0] a, b;
input ci;
wire [SIZE:0] c;
genvar i;
assign c[0] = ci;
assign co = c[SIZE];
generate
for(i=0; i<SIZE; i="i"+1)
begin:addbit
wire n1,n2,n3; //internal nets
xor g1 ( n1, a[i], b[i]);
xor g2 (sum[i],n1, c[i]);
and g3 ( n2, a[i], b[i]);
and g4 ( n3, n1, c[i]);
or g5 (c[i+1],n2, n3);
end
endgenerate
endmodule
//generate执行过程中,每一个generated net在每次循环中有唯一的名字,比如n1在4次循环中会产生如下名字:

addbit[
0].n1
addbit[
1].n1
addbit[
2].n1
addbit[
3].n1
// 这也是为什么在begin
-end块语句需要名字的一个原因。同样,实例化的module,gate等在每次循环中也有不同的名字。

addbit[
0].g1
addbit[
1].g1
addbit[
2].g1
addbit[
3].g1

posted on 2011-02-25 16:23  吾将上下而求索  阅读(12013)  评论(0编辑  收藏  举报

导航