语法错误,意外的“[”,verilog

Syntax error, unexpected '[', verilog

我在以下代码中标记为 // 2 的行中收到 "syntax error, unexpected '['"

  module reg_file
  #(
    parameter DATA_WIDTH = 8,
          ADDR_WIDTH = 2
  )
  (
    input wire clk,
    input wire wr_en,
    input wire [ADDR_WIDTH-1:0] w_addr, r_addr,
    input wire [(DATA_WIDTH*2)-1:0] w_data,
    output wire [DATA_WIDTH-1:0] r_data
  );

  reg [DATA_WIDTH-1:0] array_reg [2 ** ADDR_WIDTH - 1:0];

  always @ (posedge clk)
    if (wr_en)
      array_reg[w_addr] <= w_data[15:8];    // 1
      array_reg[w_addr + 1] <= w_data[7:0]; // 2
  assign r_data = array_reg[r_addr];

endmodule

我想将一个16位的字写到8位的寄存器文件中。当我评论标记为 // 1 或 // 2 的行之一时 - 编译正常。我违反了什么规则? 谢谢

从代码来看,您似乎错过了该语言的范围规则。由于缺少 "begin" 和 "end",您错过了在代码中定义 always 块的范围。 此外,您还需要为 if 块定义 "begin" 和 "end" 。所以你的代码应该如下所示

module reg_file
  #(
    parameter DATA_WIDTH = 8,
          ADDR_WIDTH = 2
  )
  (
    input wire clk,
    input wire wr_en,
    input wire [ADDR_WIDTH-1:0] w_addr, r_addr,
    input wire [(DATA_WIDTH*2)-1:0] w_data,
    output wire [DATA_WIDTH-1:0] r_data
  );

  reg [DATA_WIDTH-1:0] array_reg [2 ** ADDR_WIDTH - 1:0];

  always @ (posedge clk) begin
    if (wr_en) begin
      array_reg[w_addr] <= w_data[15:8];    // 1
      array_reg[w_addr + 1] <= w_data[7:0]; // 2
    end
  end
  assign r_data = array_reg[r_addr];

endmodule