Menu
CoddyTech

安全的 case 解码

本课属于 Coddy Verilog 学习旅程的“RTL 设计与验证”单元。第 4 课,共 38 课。

对于精确的控制码,使用普通的 case 语句。为不支持的控制码提供 default 行为,并使用 assign 为所有输出赋值。使用 casex 进行通配符解码,可能会在仿真中隐藏未知的控制位,因此如果调试时需要让未知值保持可见,就不适合使用它。

相关代码片段;其余声明和连接已在挑战中提供。

always @* begin
    y = 0;
    invalid = 0;
    case (op)
        0: y = a & b;
        1: y = a | b;
        default: invalid = 1;
    endcase
end

不支持的编码会生成明确的状态,而不是保留之前的输出。

明确列出不支持的控制码,避免用 casex 掩盖未知控制码。

challenge icon

挑战

中等

实现一个 8 位逻辑单元:op 为 0 时计算 a AND b,op 为 1 时计算 a OR b,op 为 2 时计算 a XOR b,op 为 3 时返回零,并将 invalid 设为 1。对于受支持的操作,invalid 为 0。输出列:y、invalid。所有激励值都是已知的二进制值。

完成 design.v,并保留其模块名称和端口。锁定的 testbench.v 会提供输入变化,并在输入稳定后打印输出。它使用模拟器参数选择一个场景,例如 +CASE=1;不需要标准输入。不要在设计中添加打印语句、延迟或仿真终止语句。预期输出为每次观察对应一行十进制值,各值之间用一个空格分隔,行末以换行符结尾。

亲手试试

module dut (input [1:0] op, input [7:0] a, input [7:0] b, output reg [7:0] y, output reg invalid);
    // 用你的设计替换这里的占位代码。
    initial y = 0;
    initial invalid = 0;
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

RTL 设计与验证中的所有课

自己练习: Verilog 在线编译器