Menu
CoddyTech

位宽安全的参数

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

基础知识介绍了可配置的位宽。可复用的 RTL 也必须处理最小合法位宽,有意控制中间表达式的大小,并避免硬编码位位置。复制运算 {WIDTH{1'b1}} 会生成与位宽匹配的掩码。参数是展开时常量,而不是运行时控制项。

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

wire [WIDTH:0] sum;
assign sum = {1'b0,a} + {1'b0,b};
assign y = sum[WIDTH] ? {WIDTH{1'b1}} : sum[WIDTH-1:0];

进位位置和饱和值都会根据配置的位宽调整。

测试合法的最小宽度,并根据参数推导出所有依赖宽度的切片和常量。

challenge icon

挑战

中等

构建一个 WIDTH 位递增器,返回 a+1 的低 WIDTH 位。输入 b 未使用。同一个模块必须既适用于 WIDTH=1,也适用于更宽的位宽。WIDTH 为正数。锁定的测试平台会实例化 WIDTH 值为 1、4 和 8 的模块,并在位宽较窄时使用 a 和 b 的低位。输出列依次为十进制的 y1、y4 和 y8。

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

亲手试试

module dut #(parameter WIDTH=4) (input [WIDTH-1:0] a,b, output [WIDTH-1:0] y);
    // 实现这个参数化电路。
    assign y = 0;
endmodule
quiz icon自我测试

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

RTL 设计与验证中的所有课

自己练习: Verilog 在线编译器