Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
系统verilog切片阵列_Verilog_System Verilog - Fatal编程技术网

系统verilog切片阵列

系统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 ();

我仍然不确定阵列切片在系统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 ();

// 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