for语句
for循环搭配generate块使用,框架如下:
genvar i;
generate
for(i=0; i<X; i=i+1) begin
end
endgenerate
generate语句的最主要功能就是对module、reg、assign、always、task等语句或者模块进行复制。
同时,内部还可以嵌套if-else语句等。另外还要注意的,在for语句块中,当定义的被赋值变量类型不同,赋值方式也不同。
1、当定义wire型变量时,内部必须使用assign赋值;
2、当定义reg型变量时,可直接赋值。
Booth Radix-4优化后程序实现
(原程序由“纸上谈芯”发布:https://blog.csdn.net/zhouxuanyuye/article/details/106366316)
经本人修改优化后,综合得到的参考面积在140-150单元之间,相比其他乘法器面积功耗小很多
module mult_booth6 #(parameter DL = 8)(
input clk,
input resetn,
input [DL-1:0] A,
input [DL-1:0] B,
output [DL+DL-1:0] P
);
// 8 * booth code, & 8 * booth generate product
wire [(DL>>1)-1:0] zero, two;
// Encode every 3 bits
genvar i;
generate
for(i=0; i<(DL>>1); i++) begin
if(i==0)
booth_code5 u_booth_code(
.code({B[1:0], 1'b0}),
.zero(zero[i]),
.two(two[i])
);
else
booth_code5 u_booth_code(
.code(B[i*2+1:i*2-1]),
.zero(zero[i]),
.two(two[i])
);
end
endgenerate
// The corresponding code generates eight partial products
wire [DL:0] Anot;
assign Anot = (~{A[7],A} + 1'b1) ; // 9b
wire [(DL>>1)-1:0][DL+1:0] prod; // 10b
generate
for(i=0; i<(DL>>1); i++) begin
booth_gen_prod5 u_gen_prod(
.A(A),
.Anot(Anot),
.sign(B[2*i+1]),
.zero(zero[i]),
.two(two[i]),
.prod(prod[i])
);
end
endgenerate
// wire [12:0] p1, p2; // 13b
// assign p1 = {{3{prod[0][DL+1]}},prod[0]} + ({{3{prod[1][DL+1]}},prod[1]}<<2); // 9b<<2 -> 11b, + ->12b
// assign p2 = {{3{prod[2][DL+1]}},prod[2]} + ({{3{prod[3][DL+1]}},prod[3]}<<2);
// assign P = {{3{p1[12]}},p1} + ({{3{p2[12]}},p2}<<4); // 12b->16b
assign P = {{6{prod[0][DL+1]}},prod[0]} + ({{6{prod[1][DL+1]}},prod[1]}<<2) + ({{6{prod[2][DL+1]}},prod[2]}<<4) + ({{6{prod[3][DL+1]}},prod[3]}<<6);
endmodule
综合
无论使用for语句实现组合逻辑或是时序逻辑,其都可以被综合,并且综合后的底层电路是对每层for循环的并行实现,而不是像软件编程中的循环迭代。