localparam 用于不关心大小写值。是1'b吗?合法吗?

问题描述 投票:0回答:1

你能复制并连接一个“吗?”字面意义上的?看来我的工具接受它。


我有一个位列表。

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。

verilog priority-queue
1个回答
0
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.