写作说明:
写给新手,帮助新手快速上手verilog,能够实现快速的FPGA开发需求或者IC design需求。本账号后续会持续更新,旨在帮助新手快速上手IC设计或者人工智能、AI infra,新手想学习可以加关注~
相关链接:
IC设计(一)-verilog实现1bit全加器仿真-CSDN博客
设计代码:
在IC设计(一)-verilog实现1bit全加器仿真-CSDN博客中,我们已经实现了一个1bit的全加器。最简单的方案是通过1bit全加器的例化,来拼接成4bit的全加器。(数字IC设计中,“搭积木”的思想非常重要,如何使用已有代码搭出复杂的电路是IC设计师的能力需求。)
代码如下:
`include "full_adder.v"
module full_adder_4bit(
input wire [3:0] a,
input wire [3:0] b,
input wire ci,
output wire [3:0] So,
output wire [3:0] Co
);
wire [3:0] Co_temp;
//第一个例化模块一般格式有所差异,需要单独例化
full_adder u_full_adder(
.Ai(a[0]),
.Bi(b[0]),
.Ci(ci==1'd1?1'd1:1'd0),
.So(So[0]),
.Co(Co_temp[0])
);
//generate重复例化
genvar i;
generate
for(i=1;i<=3;i=i+1) begin
full_adder u_full_adder(
.Ai(a[i]),
.Bi(b[i]),
.Ci(Co_temp[i-1]),
.So(So[i]),
.Co(Co_temp[i])
);
end
endgenerate
assign Co = Co_temp[3];
endmodule
其中full_adder.v是1bit的全加器设计文件。见IC设计(一)-verilog实现1bit全加器仿真-CSDN博客
测试(testbench)代码:
`timescale 1ns/1ns
`include "full_adder_4bit.v"
module full_adder_4bit_tb();
reg [3:0] a;
reg [3:0] b;
reg ci;
wire [3:0] So;
wire [3:0] Co;
full_adder_4bit u_full_adder_4it(
.a(a),
.b(b),
.ci(1'b0),
.So(So),
.Co(Co)
);
initial begin
a = 4'd5;
b = 4'd2;
#10
a = 4'd10;
b = 4'd8;
end
initial begin
$dumpfile("full_adder_4bit.vcd");
$dumpvars(0);
#200 $finish;
end
endmodule
vcd波形文件打开后,如下图所示:
可以看到,功能验证正确。(testbench采用了最简单的写法,方便新手理解,暂时不考虑覆盖率的问题。)