Menu
CoddyTech

溢出与饱和

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

有符号溢出是指数学结果无法放入所选的 signed 位宽中。它与无符号进位不同。对于 signed 加法,当输入符号相同而结果符号改变时,就会发生溢出。饱和运算会将结果限制在可表示的端点,而不是让结果回绕。

相关代码片段;挑战中提供了外围声明和连接。

assign overflow = (a[7] == b[7]) && (sum[7] != a[7]);

符号不同的输入不会导致 signed 加法溢出;符号相同的输入需要检查结果的符号。

检查 signed 溢出时要独立于进位进行;实现饱和运算前,先扩展位宽。

challenge icon

挑战

中等

将有符号的 8 位 a 和 b 相加。返回回绕后的有符号结果 y;只有当精确的数学和小于 -128 或大于 127 时,overflow=1。输出列:y、overflow。所有激励值都是已知的二进制值。

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

亲手试试

module dut (input signed [7:0] a, input signed [7:0] b, output signed [7:0] y, output overflow);
    // 用你的设计替换这里的占位内容。
    assign y = 0;
    assign overflow = 0;
endmodule
quiz icon自我测试

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

RTL 设计与验证中的所有课

自己练习: Verilog 在线编译器