你能复制并连接一个“吗?”字面意义上的?看来我的工具接受它。
我有一个位列表。
localparam BIT_EV0 = 0;
localparam BIT_EV1 = 1;
localparam BIT_EV2 = 2;
localparam BIT_EV3 = 3;
localparam BIT_MAX = 4; // Register size.
reg [BIT_MAX-1:0] event_queue;
我想定义一个大小写常量,例如,
localparam [BIT_MAX-1:0] PRI_EV2 =
{{BIT_MAX-BIT_EV2-1{1'b0}}, 1'b1, {BIT_EV2{1'b?}}};
这样我就可以构建,
casez(event_queue)
PRI_EV2: ;
/* etc. */
default: ;
endcase
使用
event_queue[BIT_EVx] = 1'b0;
设置/清除事件现在,我必须显式键入大小写常量,并在添加和删除新事件位时更新所有这些常量。案例标签具有“不是”数字构造的操作。它们聚合目标消息队列/fifo 的数据。
有趣的是,我可以使用本地参数,例如,
localparam [BIT_MAX-1:0] PRI_EV2 = 4'b01??;
所以唯一的问题是指定一个“?”常量,它似乎与
1'b?
一起使用,但我不知道这是一种语言构造,也从未在复制和串联中看到它被提及。它试图追踪 2001 年标准,但被“constant_expression”卡住了。
我试图限制为 Verilog-2001。
casez
来支持通配符。您可以使用
z
来表示无关位。在 EDAplayground 上使用 iverilog 进行测试 https://www.edaplayground.com/x/DxKz
module tb;
localparam BIT_EV0 = 0;
localparam BIT_EV1 = 1;
localparam BIT_EV2 = 2;
localparam BIT_EV3 = 3;
localparam BIT_MAX = 4; // Register size.
reg [BIT_MAX-1:0] event_queue;
localparam [BIT_MAX-1:0] PRI_EV2 = {{BIT_MAX-BIT_EV2-1{1'b0}}, 1'b1, {BIT_EV2{1'bz}}}; // z for wildcard
always @* begin
casez(event_queue)
PRI_EV2: $display("in PRI_EV2 with event_queue=%b", event_queue);
/* etc. */
default: $display("in default with event_queue=%b", event_queue);
endcase
end
integer i;
initial begin
for(i=0; i<2**BIT_MAX; i=i+1)
#1 event_queue = i;
#2 $finish;
end
endmodule