我在 Verilog 中有一个案例结构,大约有 95 个案例。

        case(address)
            5'd0: header_buffer[7:0] <= writedata;
            5'd1: header_buffer[15:8] <= writedata;
            5'd2: header_buffer[23:16] <= writedata;
            5'd3: header_buffer[31:24] <= writedata;

如您所见,有一个非常可预测的模式。有没有更好的方法来写这个,这样我就不必手动写出所有案例,这样我就可以将其缩放到任意大的尺寸,例如 100 或 200 个案例?似乎某种类型的 for 循环语法非常有用。

最佳答案

它可以通过位切片在一两行中完成,但是您需要检查您的合成器属性是否生成它。

header_buffer[8*address +: 8] <= writedata;

如果地址可能超出范围(例如地址==100,最大值为 95),那么您应该使用 if 条件:
if (address < MAX_ADDRESS)
  header_buffer[8*address +: 8] <= writedata;

描述和示例可以在 IEEE Std 1800-2012 § 11.5.1 矢量位选择和部分选择寻址中找到。第一个 IEEE 出现是 IEEE 1364-2001 (Verilog) § 4.2.1 矢量位选择和部分选择寻址。您可能还想查看之前在 Indexing vectors and arrays with +: 上回答过的问题

谨慎的话。尽管自 Verilog-2001 以来,位切片已成为标准的一部分,但并非所有工具都通过适当的优化完全实现了位切片。有时,即使两者在功能上相同,传统的完整 case 语句也会产生更好的结果。

关于syntax - Verilog:案例结构中许多案例的更好语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23398972/

10-12 05:10