功能、位宽与边界测试
返回 ALU 任务总览。
被测规格
simple_alu 在时钟上升沿采样 req_valid/op/a/b。有效请求使结果寄存并令 rsp_valid=1;无请求时 rsp_valid=0,result 保持。rst_n 为低有效异步复位,清零两个输出。这里没有 ready、背压或流水线多笔未完成事务。
| op | 运算 | 关键边界 |
|---|---|---|
| 0 | 加法 | 只保留低 8 位 |
| 1 | 减法 | 只保留低 8 位 |
| 2 | 按位与 | 位模式交错 |
| 3 | 按位或 | 位模式交错 |
| 4 | 按位异或 | 位模式交错 |
| 5 | 左移 a << b | 移位量 0、1、8 |
| 6、7 | 默认分支 | 结果为零 |
关键 RTL 形式:
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rsp_valid <= 1'b0;
result <= '0;
end else begin
rsp_valid <= req_valid;
if (req_valid) begin
unique case (op)
3'd0: result <= a + b;
3'd1: result <= a - b;
3'd2: result <= a & b;
3'd3: result <= a | b;
3'd4: result <= a ^ b;
3'd5: result <= a << b;
default: result <= '0;
endcase
end
end
end'0 是按赋值目标的位宽填满零;8 位 result 得到八个零。'1 则填满一,不等于数值 1。加法 8'hff + 8'd1 截断为 0;减法 8'd3 - 8'd5 的 8 位结果是 8'hfe,按无符号十进制打印为 254。本模块没有单独的 carry、borrow 或 overflow 输出,不要把截断误称为已经检测了溢出标志。
任务演进与定向测试
最初六例建立自动比较;之后加入 7+9、左移操作、左移量 0/1/8 等,形成 14 条定向测试。当前还加入一次 6+9=15 作为运行中复位前的非零结果,并定向测试 op=6/7,共 17 条定向测试。随机的 20 条在其后执行,总计 37 条。早期“14 条 PASS”是历史阶段,不是当前总数。
推荐人工推导的用例:
| 输入 | 期望 |
|---|---|
a=8'hff, b=1, op=ADD | 0 |
a=3, b=5, op=SUB | 8'hfe |
a=8'h81, b=0, op=SHIFT | 8'h81 |
a=8'h81, b=1, op=SHIFT | 8'h02 |
a=8'hff, b=8, op=SHIFT | 0 |
op=6 或 7 | 0 |
任务:证明比较器能发现错
把 XOR 实现临时替换为 OR 后,f0 ^ 5a = aa(170),而错误结果 f0 | 5a = fa(250),平台报告期望与实际不匹配;随后恢复正确 DUT。与只看波形相比,自动比较给出明确的失败证据。此练习不能替代对所有边界的覆盖分析。
下一步读 事务与包:将一组 op/a/b 封装为一笔可传递的测试。