DevCN
菜单
全部文章快讯开发深度热点

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 时错误实现的和位为一,自动检查应失败。恢复异或后通过,说明测试能发现实际逻辑缺陷而不仅是打印四行结果。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。