我在以下代码中标记为// 2的行中收到“语法错误,意外'['”
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
我想在8位寄存器文件中写一个16位字。当我评论标记为// 1或// 2的其中一行时 - 编译正常。我违反了什么规则? 感谢
答案 0 :(得分:4)
从代码中看,您似乎错过了该语言的范围规则。您错过了通过错过“开始”和“结束”来定义代码中始终阻止的范围。 此外,您还需要为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