【发布时间】:2017-10-03 17:00:17
【问题描述】:
有时在参数化代码中会出现一种情况,我想检查一个数组切片,如果该切片的宽度不为零。我可能会这样写:
parameter SLICE_WIDTH;
parameter SLICE_BASE;
logic [my_array_size : 0] my_array;
//...
always_ff @ (posedge clk) begin
if (SLICE_WIDTH==0 || my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin
//alternately "if (SLICE_WIDTH==0 || my_array[SLICE_WIDTH+SLICE_BASE-1:SLICE_BASE]==0) begin"
//do something
end
else begin
//do something else
end
end
这就是我在编写 VHDL 时处理这些情况的方式;依靠不断评估中的短路来防止评估无效的数组范围。在编写的系统verilog中,这会在QuestaSim中引发“零件选择范围被反转”错误和“范围宽度不能为零”错误。
有没有办法干净地处理大多数工具接受的空范围,而无需将//do something 的内容复制到几个 if-generate 构造中?
【问题讨论】: