系统verilog切片阵列
我仍然不确定阵列切片在系统Verilog中是如何工作的 例如,假设我有一个压缩的2D数组系统verilog切片阵列,verilog,system-verilog,Verilog,System Verilog,我仍然不确定阵列切片在系统Verilog中是如何工作的 例如,假设我有一个压缩的2D数组 localparam [0:2][4:0] TEMP = {5'd4,5'd9,5'd20}; 所以我的数组有三行,每行是一个5位数字 所以,当我尝试做这样的事情时,它不太管用 logic [1:0] arr; assign arr = TEMP[0][1:0] 这怎么不起作用? 编译器没有抱怨,但是模拟显示了所有的'X 在这里,我将包括有问题的模块: module slice_issue ();
localparam [0:2][4:0] TEMP = {5'd4,5'd9,5'd20};
所以我的数组有三行,每行是一个5位数字
所以,当我尝试做这样的事情时,它不太管用
logic [1:0] arr;
assign arr = TEMP[0][1:0]
这怎么不起作用?
编译器没有抱怨,但是模拟显示了所有的'X
在这里,我将包括有问题的模块:
module slice_issue ();
// clock and reset
reg board_resetl;
reg tb_clkh;
parameter CLK_PER = 4;
always #(CLK_PER/2) tb_clkh = ~ tb_clkh;
initial begin: main_process
board_resetl = 0;
tb_clkh = 0;
#100
@(posedge tb_clkh);
board_resetl = 1;
end
localparam logic [4:0] PARAM_1 = 14;
localparam logic [4:0] PARAM_2 = 18;
localparam logic [4:0] PARAM_3 = 26;
localparam [0:2] [4:0] CAND_MODE_LIST = {PARAM_1, PARAM_2, PARAM_3};
logic [1:0] temp;
logic [4:0] temp2;
logic [1:0] in_pred_mode;
logic [4:0] cnt_reg;
always @ (posedge tb_clkh or negedge board_resetl)
begin
if (~board_resetl) begin
in_pred_mode <= 0;
cnt_reg <= 0;
end else
cnt_reg <= cnt_reg + 1;
if (cnt_reg == 31) begin
in_pred_mode <= $urandom_range(0, 1);
end
end
// bad
assign temp = CAND_MODE_LIST[in_pred_mode][1:0];
// good
assign temp2 = CAND_MODE_LIST[in_pred_mode];
endmodule
模块切片问题();
//时钟和复位
注册董事会;
雷格·特布·克莱赫;
参数CLK_PER=4;
始终#(CLK#U PER/2)tb#U clkh=~tb#U clkh;
初始开始:主流程
板_resetl=0;
tb_clkh=0;
#100
@(posedge tb_clkh);
电路板复位L=1;
结束
localparam逻辑[4:0]PARAM_1=14;
localparam逻辑[4:0]参数2=18;
localparam逻辑[4:0]参数3=26;
localparam[0:2][4:0]CAND_MODE_LIST={PARAM_1,PARAM_2,PARAM_3};
逻辑[1:0]温度;
逻辑[4:0]temp2;
_pred_模式下的逻辑[1:0];
逻辑[4:0]cnt_reg;
始终@(posedge tb_clkh或negedge board_resetl)
开始
如果(~board_resetl)开始
在_pred_模式中,一个自包含的示例可以是:
module tb;
localparam [0:2][4:0] TEMP = {5'd4,5'd9,5'd20};
logic [1:0] arr;
assign arr = TEMP[0][1:0];
initial begin
$display("arr : %b", arr);
#1ps;
$display(TEMP[0]);
$display(TEMP[1]);
$display(TEMP[2]);
$display("arr : %b", arr);
end
endmodule
对我来说,这(正确)输出:
这不会显示问题的错误情况,除非问题添加更多信息,否则无法确定错误的确切原因
我应该得到一个积极的观点,而不是消极的观点。我联系了供应商(Aldec),结果发现这是Aldec的模拟器问题,他们将在下一版本中修复它 你能解释一下你认为编译器应该抱怨什么吗?我觉得你的代码很好。TEMP是一个15位参数,您已使用15位串联进行赋值。因为它是一个压缩数组,所以大小甚至不必匹配。隐式参数类型为logic
,因此在分配arr之前的时间0处可能存在竞争;它可能仍然是“x”。你需要展示一个完整的例子。我不知道我的问题为什么会有一个负号。我的代码中没有其他内容。就是这样。只是为了测试,我把它放在一个模块中,在我的代码中甚至没有一个连续的过程。这在模拟过程中根本不起作用。我只是想知道为什么?同样,没有任何警告或任何东西,但结果始终是“x”。到目前为止,您显示的代码不会自行编译-它不在模块或接口内。你怎么知道arr是'x'呢?美元显示器在哪里
# KERNEL: arr : 00
# KERNEL: 4
# KERNEL: 9
# KERNEL: 20
# KERNEL: arr : 00