Verilog 入门:用半加器理解组合逻辑与测试平台
实现一位半加器,用独立测试平台遍历全部输入组合,通过自动检查验证和位与进位,区分硬件描述与软件执行。
本节目标
实现一位半加器,用独立测试平台遍历全部输入组合,通过自动检查验证和位与进位,区分硬件描述与软件执行。
环境与运行方法
安装 Icarus Verilog,保存为 lesson.v,执行 iverilog -g2012 -s testbench -o lesson lesson.v,再执行 vvp lesson。这是仿真验证,不代表已经通过 FPGA 综合、时序分析或硬件测试。
核心思路
半加器的和位是异或,进位是与。连续赋值描述输入变化时输出应满足的关系,不是普通软件按行执行的循环。测试平台负责提供输入、等待仿真更新并检查结果。
完整示例
module half_adder(input wire a, b, output wire sum, carry);
assign sum = a ^ b;
assign carry = a & b;
endmodule
module testbench;
reg a, b;
wire sum, carry;
integer i;
half_adder dut(a, b, sum, carry);
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i[1:0];
#1;
if ({carry, sum} !== ({1'b0, a} + {1'b0, b}))
$fatal(1, "wrong result");
$display("%b%b -> %b%b", a, b, carry, sum);
end
$finish;
end
endmodule预期输出
00 -> 00
01 -> 01
10 -> 01
11 -> 10逐步理解
测试平台把 i 的低两位送给 a 和 b。拼接时 carry 位于高位,sum 位于低位,因此两个输入都为一时结果是二进制 10。显式扩展操作数到两位,避免表达式位宽截断进位。
!== 是包含未知态检查的比较,能让 X 或 Z 不被普通布尔判断掩盖。#1 属于仿真等待,不应理解成已经设计了一纳秒物理电路延时。DUT 与测试平台承担不同职责。
常见问题与边界
- 位宽和有无符号会影响表达式结果。
- 仿真延时不是自动可综合硬件。
- 只看波形截图不如同时写自动断言。
动手练习
把和位错误地改成按位或,再运行测试。
参考答案
输入 11 时错误实现的和位为一,自动检查应失败。恢复异或后通过,说明测试能发现实际逻辑缺陷而不仅是打印四行结果。
文章回复
0 条公开回复