verilog中的参数化位字段

verilog中的参数化位字段,verilog,fpga,register-transfer-level,Verilog,Fpga,Register Transfer Level,是否可以在verilog中参数化位字段?基本上,我想使用一个参数或备选方案来定义位范围。我能想到的唯一方法是使用如下所示的“定义”,但似乎应该有更好的方法 `define BITFIELD_SELECT 31:28 foo = bar[BITFIELD_SELECT] 参数比定义的更好(更安全),因为命名空间对于项目来说不是全局的。您应该能够使用两个参数来完成此操作 parameter BITFIELD_HIGH = 31; parameter BITFIELD_LOW = 28; assi

是否可以在verilog中参数化位字段?基本上,我想使用一个参数或备选方案来定义位范围。我能想到的唯一方法是使用如下所示的“定义”,但似乎应该有更好的方法

`define BITFIELD_SELECT 31:28
foo = bar[BITFIELD_SELECT]
参数比定义的更好(更安全),因为命名空间对于项目来说不是全局的。您应该能够使用两个参数来完成此操作

parameter BITFIELD_HIGH = 31;
parameter BITFIELD_LOW = 28;

assign foo = bar[BITFIELD_HIGH:BITFIELD_LOW];
或者

parameter BITFIELD_HIGH = 31;
localparam BITFIELD_LOW = BITFIELD_HIGH-3;

assign foo = bar[BITFIELD_HIGH:BITFIELD_LOW];
如果使用宏(定义),则在调用宏时包含“`”

`define BITFIELD_SELECT 31:28
foo = bar[`BITFIELD_SELECT]; // `BITFIELD_SELECT

是的,我不是一个真正的“define”方法的粉丝,因此我提出了这个问题。这是你在实践中使用的还是仅仅是对所问问题的回答?我忘了我是否定义过上下限。我多次使用参数来定义向量的宽度。Ie:foo[(宽度-1):0]。它在实践中效果很好,并且与generate语句结合起来非常强大;这是正确的,但是宏不是参数。有一个参数宽度,然后像:
parameter WIDTH=8;/*…*/foo=bar[(宽度-1):0]