语法错误,意外的“[”,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
我在以下代码中标记为 // 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