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