diff --git a/lacpu/rtl/cpu/axi_ctrl.v b/lacpu/rtl/cpu/axi_ctrl.v new file mode 100644 index 0000000..7dc6b54 --- /dev/null +++ b/lacpu/rtl/cpu/axi_ctrl.v @@ -0,0 +1,428 @@ +`default_nettype wire + +module axi_ctrl_v5 +#( + parameter TAG_WD = 21, + parameter INDEX_WD = 64, + parameter CACHELINE_WD = 512, + parameter STAGE_WD = 12 +) +( + input clk, + input reset, + + // icache interface + input icache_re, // miss + input [31 :0] icache_raddr, // miss_addr + output reg [CACHELINE_WD -1:0] icache_cacheline_new, + + input icache_we, // we_back + input [31 :0] icache_waddr, // waddr + input [CACHELINE_WD -1:0] icache_cacheline_old, // wback + + output reg icache_refresh, + + // dcache interface + input dcache_re, // miss + input [31 :0] dcache_raddr, // miss_addr + output reg [CACHELINE_WD -1:0] dcache_cacheline_new, + + input dcache_we, // we_back + input [31 :0] dcache_waddr, // waddr + input [CACHELINE_WD -1:0] dcache_cacheline_old, // wback + + output reg dcache_refresh, // fin + + // uncache interface + input uncache_en, + input [3 :0] uncache_we, + input [31 :0] uncache_addr, + input [31 :0] uncache_wdata, + output reg [31 :0] uncache_rdata, + output reg uncache_refresh, + + //总线侧接口 + //读地址通道信号 + output reg [3 :0] arid, //读地址ID,用来标志一组写信号 + output reg [31:0] araddr, //读地址,给出一次写突发传输的读地址 + output reg [3 :0] arlen, //突发长度,给出突发传输的次数 + output reg [2 :0] arsize, //突发大小,给出每次突发传输的字节数 + output reg [1 :0] arburst, //突发类型 + output reg [1 :0] arlock, //总线锁信号,可提供操作的原子性 + output reg [3 :0] arcache, //内存类型,表明一次传输是怎样通过系统的 + output reg [2 :0] arprot, //保护类型,表明一次传输的特权级及安全等级 + output reg arvalid, //有效信号,表明此通道的地址控制信号有效 + input arready, //表明"从"可以接收地址和对应的控制信号 + //读数据通道信号 + input [3 :0] rid, //读ID tag + input [31:0] rdata, //读数据 + input [1 :0] rresp, //读响应,表明读传输的状态 + input rlast, //表明读突发的最后一次传输 + input rvalid, //表明此通道信号有效 + output reg rready, //表明主机能够接收读数据和响应信息 + + //写地址通道信号 + output reg [3 :0] awid, //写地址ID,用来标志一组写信号 + output reg [31:0] awaddr, //写地址,给出一次写突发传输的写地址 + output reg [3 :0] awlen, //突发长度,给出突发传输的次数 + output reg [2 :0] awsize, //突发大小,给出每次突发传输的字节数 + output reg [1 :0] awburst, //突发类型 + output reg [1 :0] awlock, //总线锁信号,可提供操作的原子性 + output reg [3 :0] awcache, //内存类型,表明一次传输是怎样通过系统的 + output reg [2 :0] awprot, //保护类型,表明一次传输的特权级及安全等级 + output reg awvalid, //有效信号,表明此通道的地址控制信号有效 + input awready, //表明"从"可以接收地址和对应的控制信号 + //写数据通道信号 + output reg [3 :0] wid, //一次写传输的ID tag + output reg [31:0] wdata, //写数据 + output reg [3 :0] wstrb, //写数据有效的字节线,用来表明哪8bits数据是有效的 + output reg wlast, //表明此次传输是最后一个突发传输 + output reg wvalid, //写有效,表明此次写有效 + input wready, //表明从机可以接收写数据 + //写响应通道信号 + input [3 :0] bid, //写响应ID tag + input [1 :0] bresp, //写响应,表明写传输的状态 00为正常,当然可以不理会 + input bvalid, //写响应有效 + output reg bready //表明主机能够接收写响应 + +); + reg [CACHELINE_WD -1:0] icache_rdata_buffer; + reg [CACHELINE_WD -1:0] icache_wdata_buffer; + reg [CACHELINE_WD -1:0] dcache_rdata_buffer; + reg [CACHELINE_WD -1:0] dcache_wdata_buffer; + reg [31 :0] icache_raddr_buffer; + reg [31 :0] icache_waddr_buffer; + reg [31 :0] dcache_raddr_buffer; + reg [31 :0] dcache_waddr_buffer; + reg [3 :0] icache_offset; + reg [3 :0] dcache_offset; + reg [3 :0] dcache_offset_w; + reg icache_re_buffer; + reg dcache_re_buffer; + reg icache_we_buffer; + reg dcache_we_buffer; + + reg uncache_en_buffer; + reg [3 :0] uncache_we_buffer; + reg [31 :0] uncache_addr_buffer; + reg [31 :0] uncache_wdata_buffer; + reg [31 :0] uncache_rdata_buffer; + + reg [STAGE_WD -1:0] stage; + reg [STAGE_WD -1:0] stage_w; + + always @(posedge clk) begin + if(reset) begin + arid <= 4'b0000; + araddr <= 32'b0; + arlen <= 4'b0000; + arsize <= 3'b010; + arburst <= 2'b01; + arlock <= 2'b00; + arcache <= 4'b0000; + arprot <= 3'b000; + arvalid <= 1'b0; + + rready <= 1'b0; + + stage <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + + icache_refresh <= 0; + dcache_refresh <= 0; + icache_cacheline_new <= 0; + dcache_cacheline_new <= 0; + + uncache_refresh <= 1'b0; + uncache_rdata <= 32'b0; + end + else begin + case (1'b1) + stage[0]: begin + icache_refresh <= 1'b0; + dcache_refresh <= 1'b0; + uncache_refresh <= 1'b0; + + icache_re_buffer <= icache_re; + icache_raddr_buffer <= icache_raddr; + icache_we_buffer <= icache_we; + icache_waddr_buffer <= icache_waddr; + + dcache_re_buffer <= dcache_re; + dcache_raddr_buffer <= dcache_raddr; + dcache_we_buffer <= dcache_we; + dcache_waddr_buffer <= dcache_waddr; + + uncache_en_buffer <= uncache_en; + uncache_we_buffer <= uncache_we; + uncache_addr_buffer <= uncache_addr; + uncache_wdata_buffer <= uncache_wdata; + + if (dcache_we|(uncache_en&((|uncache_we)))) begin + stage <= stage << 1; + end + else if (icache_re|dcache_re|(uncache_en&~(|uncache_we))) begin + stage <= stage << 2; + end + end + stage[1]: begin + icache_wdata_buffer <= icache_cacheline_old; + dcache_wdata_buffer <= dcache_cacheline_old; + if (icache_re_buffer|dcache_re_buffer|(uncache_en_buffer&~(|uncache_we_buffer))) begin + stage <= stage << 1; + end + else begin + stage <= {1'b0,1'b1,10'b0}; + end + end + stage[2]:begin + if (icache_re_buffer) begin + arid <= 4'b0; + araddr <= icache_raddr_buffer; + arlen <= 4'hf; + arsize <= 3'b010; + arvalid <= 1'b1; + + stage <= stage << 1; + end + else begin + stage <= stage << 3; + end + end + stage[3]:begin + if (arready) begin + arvalid <= 1'b0; + araddr <= 32'b0; + rready <= 1'b1; + icache_offset <= 4'd0; + stage <= stage << 1; + end + end + stage[4]:begin + if (!rlast&rvalid) begin + icache_rdata_buffer[icache_offset*32+:32] <= rdata; + icache_offset <= icache_offset + 1'b1; + end + else if(rlast&rvalid) begin + icache_rdata_buffer[icache_offset*32+:32] <= rdata; + rready <= 1'b0; + stage <= stage << 1; + end + end + stage[5]:begin + if (dcache_re_buffer) begin + arid <= 4'b1; + araddr <= dcache_raddr_buffer; + arlen <= 4'hf; + arsize <= 3'b010; + arvalid <= 1'b1; + + stage <= stage << 1; + end + else if (uncache_en_buffer&~(|uncache_we_buffer)) begin + arid <= 4'b1; + araddr <= uncache_addr_buffer; + arlen <= 4'b0; + arsize <= 3'b010; + arvalid <= 1'b1; + stage <= stage << 3; + end + else begin + stage <= {1'b0,1'b1,10'b0}; + end + end + stage[6]:begin + if (arready) begin + arvalid <= 1'b0; + araddr <= 32'b0; + rready <= 1'b1; + dcache_offset <= 4'd0; + stage <= stage << 1; + end + end + stage[7]:begin + if (!rlast&rvalid) begin + dcache_rdata_buffer[dcache_offset*32+:32] <= rdata; + dcache_offset <= dcache_offset + 1'b1; + end + else if (rlast&rvalid) begin + dcache_rdata_buffer[dcache_offset*32+:32] <= rdata; + rready <= 1'b0; + stage <= {1'b0,1'b1,10'b0}; + end + end + stage[8]:begin + if (arready) begin + arvalid <= 1'b0; + araddr <= 32'b0; + rready <= 1'b1; + stage <= stage << 1; + end + end + stage[9]:begin + if (rvalid) begin + uncache_rdata_buffer <= rdata; + rready <= 1'b0; + stage <= {1'b0,1'b1,10'b0}; + end + end + stage[10]:begin + if (stage_w[10]|stage_w[0]) begin + stage <= stage << 1; + end + end + stage[11]:begin + if (icache_re_buffer) begin + icache_refresh <= 1'b1; + icache_cacheline_new <= icache_rdata_buffer; + end + if (dcache_re_buffer) begin + dcache_refresh <= 1'b1; + dcache_cacheline_new <= dcache_rdata_buffer; + end + if (uncache_en_buffer) begin + uncache_refresh <= 1'b1; + uncache_rdata <= uncache_rdata_buffer; + end + stage <= 0; + end + default:begin + stage <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + icache_refresh <= 1'b0; + dcache_refresh <= 1'b0; + uncache_refresh <= 1'b0; + end + endcase + end + end + + always @ (posedge clk) begin + if (reset) begin + awid <= 4'b0001; + awaddr <= 32'b0; + awlen <= 4'b0000; + awsize <= 3'b010; + awburst <= 2'b01; + awlock <= 2'b00; + awcache <= 4'b0000; + awprot <= 3'b000; + awvalid <= 1'b0; + + wid <= 4'b0001; + wdata <= 32'b0; + wstrb <= 4'b0000; + wlast <= 1'b0; + wvalid <= 1'b0; + + bready <= 1'b0; + + stage_w <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + end + else begin + case (1'b1) + stage_w[0]:begin + if (stage[1]) begin + if (dcache_we_buffer) begin + awid <= 4'b1; + awaddr <= dcache_waddr_buffer; + awlen <= 4'hf; + awsize <= 3'b010; + awvalid <= 1'b1; + wstrb <= 4'b1111; + wlast <= 1'b0; + bready <= 1'b1; + dcache_offset_w <= 4'b0; + stage_w <= stage_w << 1; + end + else if (|uncache_we_buffer) begin // write + awid <= 4'b1; + awaddr <= uncache_addr_buffer; + awlen <= 4'b0; + case (uncache_we_buffer) + 4'b0001,4'b0010,4'b0100,4'b1000:begin + awsize <= 3'b000; + wstrb <= uncache_we_buffer; + end + 4'b0011,4'b1100:begin + awsize <= 3'b001; + wstrb <= uncache_we_buffer; + end + 4'b1111:begin + awsize <= 3'b010; + wstrb <= uncache_we_buffer; + end + default:begin + awsize <= 3'b010; + wstrb <= uncache_we_buffer; + end + endcase + awvalid <= 1'b1; + wlast <= 1'b0; + bready <= 1'b1; + stage_w <= stage_w << 4; + end + end + end + stage_w[1]:begin + if (awready) begin + awvalid <= 1'b0; + awaddr <= 32'b0; + wdata <= dcache_wdata_buffer[dcache_offset_w*32+:32]; + wvalid <= 1'b1; + wlast <= dcache_offset_w == 4'b1111 ? 1'b1 : 1'b0; + dcache_offset_w <= dcache_offset_w + 1'b1; + if (dcache_offset_w == 4'b1111) begin + stage_w <= stage_w << 1; + end + end + end + stage_w[2]:begin + if (wready) begin + wdata <= 32'b0; + wvalid <= 1'b0; + wlast <= 1'b0; + stage_w <= stage_w << 1; + end + end + stage_w[3]:begin + if (bvalid) begin + bready <= 1'b0; + stage_w <= {1'b0,1'b1,{10{1'b0}}}; + end + end + stage_w[4]:begin + if (awready) begin + awvalid <= 1'b0; + awaddr <= 32'b0; + wdata <= uncache_wdata_buffer; + wvalid <= 1'b1; + wlast <= 1'b1; + stage_w <= stage_w << 1; + end + end + stage_w[5]:begin + if (wready) begin + wdata <= 32'b0; + wvalid <= 1'b0; + wlast <= 1'b0; + stage_w <= stage_w << 1; + end + end + stage_w[6]:begin + if (bvalid) begin + bready <= 1'b0; + stage_w <= {1'b0,1'b1,{10{1'b0}}}; + end + end + stage_w[10]:begin + if (stage[11]) begin + stage_w <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + end + end + default:begin + stage_w <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + end + endcase + end + end + +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/cache_data.v b/lacpu/rtl/cpu/cache_data.v new file mode 100644 index 0000000..6be333d --- /dev/null +++ b/lacpu/rtl/cpu/cache_data.v @@ -0,0 +1,792 @@ +`default_nettype wire + +module cache_data_v5 +#( + parameter CACHELINE_WD = 512, + parameter TAG_WD = 21, + parameter HIT_WD = 2 +) +( + input clk, + input reset, + + input write_back, + input [ 1:0] hit, + input lru, + input cached, + + // sram_port + input sram_en, + input [ 3:0] sram_we, + input [31:0] sram_addr, + input [31:0] sram_wdata, + output [31:0] sram_rdata, + + input refresh, + input [CACHELINE_WD -1:0] cacheline_new, + output [CACHELINE_WD -1:0] cacheline_old +); + wire [31 :0] rdata_way0 [15:0]; + wire [31 :0] rdata_way1 [15:0]; + wire [TAG_WD -2:0] tag; + wire [5 :0] index; + wire [5 :0] offset; + reg [HIT_WD -1:0] hit_r; + reg lru_r; + reg cached_r; + assign {tag, + index, + offset + } = sram_addr; + + wire [15:0] bank_sel; + reg [15:0] bank_sel_r; + decoder_4_16 u_decoder_4_16( + .in (offset[5:2] ), + .out (bank_sel ) + ); + + always @ (posedge clk) begin + if (reset) begin + hit_r <= 2'b0; + lru_r <= 1'b0; + cached_r <= 1'b1; + bank_sel_r <= 16'b0; + end + else begin + hit_r <= hit; + lru_r <= lru; + cached_r <= cached; + bank_sel_r <= bank_sel; + end + end + +// data_bram_way0 begin + data_bram_bank bank0_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[0]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[31:0]:sram_wdata ), // 32 + .douta (rdata_way0[0] ) // 32 + ); + data_bram_bank bank1_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[1]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[63:32]:sram_wdata ), // 32 + .douta (rdata_way0[1] ) // 32 + ); + data_bram_bank bank2_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[2]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[95:64]:sram_wdata ), // 32 + .douta (rdata_way0[2] ) // 32 + ); + data_bram_bank bank3_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[3]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[127:96]:sram_wdata ), // 32 + .douta (rdata_way0[3] ) // 32 + ); + data_bram_bank bank4_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[4]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[159:128]:sram_wdata ), // 32 + .douta (rdata_way0[4] ) // 32 + ); + data_bram_bank bank5_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[5]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[191:160]:sram_wdata ), // 32 + .douta (rdata_way0[5] ) // 32 + ); + data_bram_bank bank6_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[6]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[223:192]:sram_wdata ), // 32 + .douta (rdata_way0[6] ) // 32 + ); + data_bram_bank bank7_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[7]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[255:224]:sram_wdata ), // 32 + .douta (rdata_way0[7] ) // 32 + ); + data_bram_bank bank8_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[8]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[287:256]:sram_wdata ), // 32 + .douta (rdata_way0[8] ) // 32 + ); + data_bram_bank bank9_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[9]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[319:288]:sram_wdata ), // 32 + .douta (rdata_way0[9] ) // 32 + ); + data_bram_bank bank10_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[10]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[351:320]:sram_wdata ), // 32 + .douta (rdata_way0[10] ) // 32 + ); + data_bram_bank bank11_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[11]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[383:352]:sram_wdata ), // 32 + .douta (rdata_way0[11] ) // 32 + ); + data_bram_bank bank12_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[12]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[415:384]:sram_wdata ), // 32 + .douta (rdata_way0[12] ) // 32 + ); + data_bram_bank bank13_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[13]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[447:416]:sram_wdata ), // 32 + .douta (rdata_way0[13] ) // 32 + ); + data_bram_bank bank14_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[14]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[479:448]:sram_wdata ), // 32 + .douta (rdata_way0[14] ) // 32 + ); + data_bram_bank bank15_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[15]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[511:480]:sram_wdata ), // 32 + .douta (rdata_way0[15] ) // 32 + ); +// data_bram_way0 end + +// data_bram_way1 begin + data_bram_bank bank0_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[0]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[31:0]:sram_wdata ), // 32 + .douta (rdata_way1[0] ) // 32 + ); + data_bram_bank bank1_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[1]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[63:32]:sram_wdata ), // 32 + .douta (rdata_way1[1] ) // 32 + ); + data_bram_bank bank2_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[2]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[95:64]:sram_wdata ), // 32 + .douta (rdata_way1[2] ) // 32 + ); + data_bram_bank bank3_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[3]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[127:96]:sram_wdata ), // 32 + .douta (rdata_way1[3] ) // 32 + ); + data_bram_bank bank4_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[4]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[159:128]:sram_wdata ), // 32 + .douta (rdata_way1[4] ) // 32 + ); + data_bram_bank bank5_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[5]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[191:160]:sram_wdata ), // 32 + .douta (rdata_way1[5] ) // 32 + ); + data_bram_bank bank6_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[6]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[223:192]:sram_wdata ), // 32 + .douta (rdata_way1[6] ) // 32 + ); + data_bram_bank bank7_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[7]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[255:224]:sram_wdata ), // 32 + .douta (rdata_way1[7] ) // 32 + ); + data_bram_bank bank8_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[8]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[287:256]:sram_wdata ), // 32 + .douta (rdata_way1[8] ) // 32 + ); + data_bram_bank bank9_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[9]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[319:288]:sram_wdata ), // 32 + .douta (rdata_way1[9] ) // 32 + ); + data_bram_bank bank10_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[10]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[351:320]:sram_wdata ), // 32 + .douta (rdata_way1[10] ) // 32 + ); + data_bram_bank bank11_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[11]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[383:352]:sram_wdata ), // 32 + .douta (rdata_way1[11] ) // 32 + ); + data_bram_bank bank12_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[12]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[415:384]:sram_wdata ), // 32 + .douta (rdata_way1[12] ) // 32 + ); + data_bram_bank bank13_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[13]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[447:416]:sram_wdata ), // 32 + .douta (rdata_way1[13] ) // 32 + ); + data_bram_bank bank14_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[14]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[479:448]:sram_wdata ), // 32 + .douta (rdata_way1[14] ) // 32 + ); + data_bram_bank bank15_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[15]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[511:480]:sram_wdata ), // 32 + .douta (rdata_way1[15] ) // 32 + ); +// data_bram_way1 end + + wire [31:0] sram_rdata_way0,sram_rdata_way1; + + assign sram_rdata_way0 = ~cached_r ? 32'b0 : + bank_sel_r[ 0] ? rdata_way0[ 0] : + bank_sel_r[ 1] ? rdata_way0[ 1] : + bank_sel_r[ 2] ? rdata_way0[ 2] : + bank_sel_r[ 3] ? rdata_way0[ 3] : + bank_sel_r[ 4] ? rdata_way0[ 4] : + bank_sel_r[ 5] ? rdata_way0[ 5] : + bank_sel_r[ 6] ? rdata_way0[ 6] : + bank_sel_r[ 7] ? rdata_way0[ 7] : + bank_sel_r[ 8] ? rdata_way0[ 8] : + bank_sel_r[ 9] ? rdata_way0[ 9] : + bank_sel_r[10] ? rdata_way0[10] : + bank_sel_r[11] ? rdata_way0[11] : + bank_sel_r[12] ? rdata_way0[12] : + bank_sel_r[13] ? rdata_way0[13] : + bank_sel_r[14] ? rdata_way0[14] : + bank_sel_r[15] ? rdata_way0[15] : 32'b0; + assign sram_rdata_way1 = ~cached_r ? 32'b0 : + bank_sel_r[ 0] ? rdata_way1[ 0] : + bank_sel_r[ 1] ? rdata_way1[ 1] : + bank_sel_r[ 2] ? rdata_way1[ 2] : + bank_sel_r[ 3] ? rdata_way1[ 3] : + bank_sel_r[ 4] ? rdata_way1[ 4] : + bank_sel_r[ 5] ? rdata_way1[ 5] : + bank_sel_r[ 6] ? rdata_way1[ 6] : + bank_sel_r[ 7] ? rdata_way1[ 7] : + bank_sel_r[ 8] ? rdata_way1[ 8] : + bank_sel_r[ 9] ? rdata_way1[ 9] : + bank_sel_r[10] ? rdata_way1[10] : + bank_sel_r[11] ? rdata_way1[11] : + bank_sel_r[12] ? rdata_way1[12] : + bank_sel_r[13] ? rdata_way1[13] : + bank_sel_r[14] ? rdata_way1[14] : + bank_sel_r[15] ? rdata_way1[15] : 32'b0; + assign sram_rdata = hit_r[0] ? sram_rdata_way0 : + hit_r[1] ? sram_rdata_way1 : 32'b0; + + wire [CACHELINE_WD-1:0] cacheline_old_way0, cacheline_old_way1; + assign cacheline_old_way0 = {rdata_way0[15], + rdata_way0[14], + rdata_way0[13], + rdata_way0[12], + rdata_way0[11], + rdata_way0[10], + rdata_way0[ 9], + rdata_way0[ 8], + rdata_way0[ 7], + rdata_way0[ 6], + rdata_way0[ 5], + rdata_way0[ 4], + rdata_way0[ 3], + rdata_way0[ 2], + rdata_way0[ 1], + rdata_way0[ 0] + }; + assign cacheline_old_way1 = {rdata_way1[15], + rdata_way1[14], + rdata_way1[13], + rdata_way1[12], + rdata_way1[11], + rdata_way1[10], + rdata_way1[ 9], + rdata_way1[ 8], + rdata_way1[ 7], + rdata_way1[ 6], + rdata_way1[ 5], + rdata_way1[ 4], + rdata_way1[ 3], + rdata_way1[ 2], + rdata_way1[ 1], + rdata_way1[ 0] + }; + assign cacheline_old = lru_r ? cacheline_old_way1 : cacheline_old_way0; + +endmodule + +module cache_data_v6 +#( + parameter CACHELINE_WD = 512, + parameter TAG_WD = 21, + parameter HIT_WD = 2 +) +( + input clk, + input reset, + + input write_back, + input [ 1:0] hit, + input lru, + input cached, + + // sram_port + input sram_en, + input [ 3:0] sram_we, + input [31:0] sram_addr, + input [31:0] sram_wdata, + output [63:0] sram_rdata, + + // axi + input refresh, + input [CACHELINE_WD -1:0] cacheline_new, + output [CACHELINE_WD -1:0] cacheline_old +); + wire [31 :0] rdata_way0 [15:0]; + wire [31 :0] rdata_way1 [15:0]; + wire [TAG_WD -2:0] tag; + wire [5 :0] index; + wire [5 :0] offset; + reg [HIT_WD- 1:0] hit_r; + reg lru_r; + reg cached_r; + + assign {tag, + index, + offset + } = sram_addr; + + wire [15:0] bank_sel; + reg [15:0] bank_sel_r; + + decoder_4_16 u_decoder_4_16( + .in (offset[5:2] ), + .out (bank_sel ) + ); + + always @ (posedge clk) begin + if (reset) begin + hit_r <= 2'b0; + lru_r <= 1'b0; + cached_r <= 1'b1; + bank_sel_r <= 16'b0; + end + else begin + hit_r <= hit; + lru_r <= lru; + cached_r <= cached; + bank_sel_r <= bank_sel; + end + end + +// data_bram_way0 begin + data_bram_bank bank0_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[0]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[31:0]:sram_wdata ), // 32 + .douta (rdata_way0[0] ) // 32 + ); + data_bram_bank bank1_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[0]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[63:32]:sram_wdata ), // 32 + .douta (rdata_way0[1] ) // 32 + ); + data_bram_bank bank2_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[2]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[95:64]:sram_wdata ), // 32 + .douta (rdata_way0[2] ) // 32 + ); + data_bram_bank bank3_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[2]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[127:96]:sram_wdata ), // 32 + .douta (rdata_way0[3] ) // 32 + ); + data_bram_bank bank4_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[4]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[159:128]:sram_wdata ), // 32 + .douta (rdata_way0[4] ) // 32 + ); + data_bram_bank bank5_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[4]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[191:160]:sram_wdata ), // 32 + .douta (rdata_way0[5] ) // 32 + ); + data_bram_bank bank6_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[6]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[223:192]:sram_wdata ), // 32 + .douta (rdata_way0[6] ) // 32 + ); + data_bram_bank bank7_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[6]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[255:224]:sram_wdata ), // 32 + .douta (rdata_way0[7] ) // 32 + ); + data_bram_bank bank8_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[8]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[287:256]:sram_wdata ), // 32 + .douta (rdata_way0[8] ) // 32 + ); + data_bram_bank bank9_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[8]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[319:288]:sram_wdata ), // 32 + .douta (rdata_way0[9] ) // 32 + ); + data_bram_bank bank10_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[10]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[351:320]:sram_wdata ), // 32 + .douta (rdata_way0[10] ) // 32 + ); + data_bram_bank bank11_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[10]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[383:352]:sram_wdata ), // 32 + .douta (rdata_way0[11] ) // 32 + ); + data_bram_bank bank12_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[12]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[415:384]:sram_wdata ), // 32 + .douta (rdata_way0[12] ) // 32 + ); + data_bram_bank bank13_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[12]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[447:416]:sram_wdata ), // 32 + .douta (rdata_way0[13] ) // 32 + ); + data_bram_bank bank14_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[14]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[479:448]:sram_wdata ), // 32 + .douta (rdata_way0[14] ) // 32 + ); + data_bram_bank bank15_way0( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[14]&hit[0]|write_back ), // 1 + .wea (refresh?lru?4'b0000:4'b1111:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[511:480]:sram_wdata ), // 32 + .douta (rdata_way0[15] ) // 32 + ); +// data_bram_way0 end + +// data_bram_way1 begin + data_bram_bank bank0_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[0]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[31:0]:sram_wdata ), // 32 + .douta (rdata_way1[0] ) // 32 + ); + data_bram_bank bank1_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[0]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[63:32]:sram_wdata ), // 32 + .douta (rdata_way1[1] ) // 32 + ); + data_bram_bank bank2_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[2]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[95:64]:sram_wdata ), // 32 + .douta (rdata_way1[2] ) // 32 + ); + data_bram_bank bank3_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[2]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[127:96]:sram_wdata ), // 32 + .douta (rdata_way1[3] ) // 32 + ); + data_bram_bank bank4_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[4]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[159:128]:sram_wdata ), // 32 + .douta (rdata_way1[4] ) // 32 + ); + data_bram_bank bank5_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[4]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[191:160]:sram_wdata ), // 32 + .douta (rdata_way1[5] ) // 32 + ); + data_bram_bank bank6_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[6]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[223:192]:sram_wdata ), // 32 + .douta (rdata_way1[6] ) // 32 + ); + data_bram_bank bank7_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[6]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[255:224]:sram_wdata ), // 32 + .douta (rdata_way1[7] ) // 32 + ); + data_bram_bank bank8_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[8]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[287:256]:sram_wdata ), // 32 + .douta (rdata_way1[8] ) // 32 + ); + data_bram_bank bank9_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[8]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[319:288]:sram_wdata ), // 32 + .douta (rdata_way1[9] ) // 32 + ); + data_bram_bank bank10_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[10]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[351:320]:sram_wdata ), // 32 + .douta (rdata_way1[10] ) // 32 + ); + data_bram_bank bank11_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[10]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[383:352]:sram_wdata ), // 32 + .douta (rdata_way1[11] ) // 32 + ); + data_bram_bank bank12_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[12]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[415:384]:sram_wdata ), // 32 + .douta (rdata_way1[12] ) // 32 + ); + data_bram_bank bank13_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[12]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[447:416]:sram_wdata ), // 32 + .douta (rdata_way1[13] ) // 32 + ); + data_bram_bank bank14_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[14]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[479:448]:sram_wdata ), // 32 + .douta (rdata_way1[14] ) // 32 + ); + data_bram_bank bank15_way1( + .clka (clk ), + .ena (cached&refresh|sram_en&bank_sel[14]&hit[1]|write_back ), // 1 + .wea (refresh?lru?4'b1111:4'b0000:write_back?4'b0000:sram_we), // 4 + .addra (index ), // 7 + .dina (refresh?cacheline_new[511:480]:sram_wdata ), // 32 + .douta (rdata_way1[15] ) // 32 + ); +// data_bram_way1 end + + wire [63:0] sram_rdata_way0,sram_rdata_way1; + + assign sram_rdata_way0 = ~cached_r ? 64'b0 : + bank_sel_r[ 0] ? {rdata_way0[ 1],rdata_way0[ 0]} : + bank_sel_r[ 2] ? {rdata_way0[ 3],rdata_way0[ 2]} : + bank_sel_r[ 4] ? {rdata_way0[ 5],rdata_way0[ 4]} : + bank_sel_r[ 6] ? {rdata_way0[ 7],rdata_way0[ 6]} : + bank_sel_r[ 8] ? {rdata_way0[ 9],rdata_way0[ 8]} : + bank_sel_r[10] ? {rdata_way0[11],rdata_way0[10]} : + bank_sel_r[12] ? {rdata_way0[13],rdata_way0[12]} : + bank_sel_r[14] ? {rdata_way0[15],rdata_way0[14]} : 64'b0; + + assign sram_rdata_way1 = ~cached_r ? 64'b0 : + bank_sel_r[ 0] ? {rdata_way1[ 1],rdata_way1[ 0]} : + bank_sel_r[ 2] ? {rdata_way1[ 3],rdata_way1[ 2]} : + bank_sel_r[ 4] ? {rdata_way1[ 5],rdata_way1[ 4]} : + bank_sel_r[ 6] ? {rdata_way1[ 7],rdata_way1[ 6]} : + bank_sel_r[ 8] ? {rdata_way1[ 9],rdata_way1[ 8]} : + bank_sel_r[10] ? {rdata_way1[11],rdata_way1[10]} : + bank_sel_r[12] ? {rdata_way1[13],rdata_way1[12]} : + bank_sel_r[14] ? {rdata_way1[15],rdata_way1[14]} : 64'b0; + assign sram_rdata = hit_r[0] ? sram_rdata_way0 : + hit_r[1] ? sram_rdata_way1 : 64'b0; + + wire [CACHELINE_WD -1:0] cacheline_old_way0, cacheline_old_way1; + assign cacheline_old_way0 = { + rdata_way0[15], + rdata_way0[14], + rdata_way0[13], + rdata_way0[12], + rdata_way0[11], + rdata_way0[10], + rdata_way0[ 9], + rdata_way0[ 8], + rdata_way0[ 7], + rdata_way0[ 6], + rdata_way0[ 5], + rdata_way0[ 4], + rdata_way0[ 3], + rdata_way0[ 2], + rdata_way0[ 1], + rdata_way0[ 0] + }; + assign cacheline_old_way1 = { + rdata_way1[15], + rdata_way1[14], + rdata_way1[13], + rdata_way1[12], + rdata_way1[11], + rdata_way1[10], + rdata_way1[ 9], + rdata_way1[ 8], + rdata_way1[ 7], + rdata_way1[ 6], + rdata_way1[ 5], + rdata_way1[ 4], + rdata_way1[ 3], + rdata_way1[ 2], + rdata_way1[ 1], + rdata_way1[ 0] + }; + assign cacheline_old = lru_r ? cacheline_old_way1 : cacheline_old_way0; +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/cache_tag.v b/lacpu/rtl/cpu/cache_tag.v new file mode 100644 index 0000000..81084ac --- /dev/null +++ b/lacpu/rtl/cpu/cache_tag.v @@ -0,0 +1,242 @@ +`default_nettype wire + +module cache_tag_v5 +#( + parameter HIT_WD = 2, + parameter TAG_WD = 21, + parameter INDEX_WD = 64 +) +( + input clk, + input reset, + input flush, + + output stallreq, + + input cached, + + input sram_en, + input [ 3:0] sram_we, + input [31:0] sram_addr, + + input refresh, + output miss, + output [31:0] axi_raddr, + output write_back, + output [31:0] axi_waddr, + + output [ 1:0] hit, + output lru +); + reg [TAG_WD -1:0] tag_way0 [INDEX_WD -1:0]; + reg [TAG_WD -1:0] tag_way1 [INDEX_WD -1:0]; + reg [INDEX_WD -1:0] lru_r; + + wire [TAG_WD -2:0] tag; + wire [5:0] index; + wire [5:0] offset; + wire cached_v; + + wire hit_way0; + wire hit_way1; + wire [31:0] axi_waddr_way0; + wire [31:0] axi_waddr_way1; + wire write_back_way0; + wire write_back_way1; + + assign cached_v = cached; + + assign {tag, + index, + offset + } = sram_addr; + + // lru lru_r指向的即为最闲的那个 + always @ (posedge clk) begin + if (reset) begin + lru_r <= 0; + end + else if (hit_way0 & ~hit_way1) begin + lru_r[index] <= 1'b1; + end + else if (~hit_way0 & hit_way1) begin + lru_r[index] <= 1'b0; + end + else if (refresh) begin + lru_r[index] <= ~lru_r[index]; + end + end + + // way0 + always @ (posedge clk) begin + if (reset) begin + tag_way0[ 0] <= 21'b0; + tag_way0[ 1] <= 21'b0; + tag_way0[ 2] <= 21'b0; + tag_way0[ 3] <= 21'b0; + tag_way0[ 4] <= 21'b0; + tag_way0[ 5] <= 21'b0; + tag_way0[ 6] <= 21'b0; + tag_way0[ 7] <= 21'b0; + tag_way0[ 8] <= 21'b0; + tag_way0[ 9] <= 21'b0; + tag_way0[10] <= 21'b0; + tag_way0[11] <= 21'b0; + tag_way0[12] <= 21'b0; + tag_way0[13] <= 21'b0; + tag_way0[14] <= 21'b0; + tag_way0[15] <= 21'b0; + tag_way0[16] <= 21'b0; + tag_way0[17] <= 21'b0; + tag_way0[18] <= 21'b0; + tag_way0[19] <= 21'b0; + tag_way0[20] <= 21'b0; + tag_way0[21] <= 21'b0; + tag_way0[22] <= 21'b0; + tag_way0[23] <= 21'b0; + tag_way0[24] <= 21'b0; + tag_way0[25] <= 21'b0; + tag_way0[26] <= 21'b0; + tag_way0[27] <= 21'b0; + tag_way0[28] <= 21'b0; + tag_way0[29] <= 21'b0; + tag_way0[30] <= 21'b0; + tag_way0[31] <= 21'b0; + tag_way0[32] <= 21'b0; + tag_way0[33] <= 21'b0; + tag_way0[34] <= 21'b0; + tag_way0[35] <= 21'b0; + tag_way0[36] <= 21'b0; + tag_way0[37] <= 21'b0; + tag_way0[38] <= 21'b0; + tag_way0[39] <= 21'b0; + tag_way0[40] <= 21'b0; + tag_way0[41] <= 21'b0; + tag_way0[42] <= 21'b0; + tag_way0[43] <= 21'b0; + tag_way0[44] <= 21'b0; + tag_way0[45] <= 21'b0; + tag_way0[46] <= 21'b0; + tag_way0[47] <= 21'b0; + tag_way0[48] <= 21'b0; + tag_way0[49] <= 21'b0; + tag_way0[50] <= 21'b0; + tag_way0[51] <= 21'b0; + tag_way0[52] <= 21'b0; + tag_way0[53] <= 21'b0; + tag_way0[54] <= 21'b0; + tag_way0[55] <= 21'b0; + tag_way0[56] <= 21'b0; + tag_way0[57] <= 21'b0; + tag_way0[58] <= 21'b0; + tag_way0[59] <= 21'b0; + tag_way0[60] <= 21'b0; + tag_way0[61] <= 21'b0; + tag_way0[62] <= 21'b0; + tag_way0[63] <= 21'b0; + end + else if (refresh & (~lru_r[index])) begin + tag_way0[index] <= {cached_v, tag}; + end + end + + // way1 + always @ (posedge clk) begin + if (reset) begin + tag_way1[ 0] <= 21'b0; + tag_way1[ 1] <= 21'b0; + tag_way1[ 2] <= 21'b0; + tag_way1[ 3] <= 21'b0; + tag_way1[ 4] <= 21'b0; + tag_way1[ 5] <= 21'b0; + tag_way1[ 6] <= 21'b0; + tag_way1[ 7] <= 21'b0; + tag_way1[ 8] <= 21'b0; + tag_way1[ 9] <= 21'b0; + tag_way1[10] <= 21'b0; + tag_way1[11] <= 21'b0; + tag_way1[12] <= 21'b0; + tag_way1[13] <= 21'b0; + tag_way1[14] <= 21'b0; + tag_way1[15] <= 21'b0; + tag_way1[16] <= 21'b0; + tag_way1[17] <= 21'b0; + tag_way1[18] <= 21'b0; + tag_way1[19] <= 21'b0; + tag_way1[20] <= 21'b0; + tag_way1[21] <= 21'b0; + tag_way1[22] <= 21'b0; + tag_way1[23] <= 21'b0; + tag_way1[24] <= 21'b0; + tag_way1[25] <= 21'b0; + tag_way1[26] <= 21'b0; + tag_way1[27] <= 21'b0; + tag_way1[28] <= 21'b0; + tag_way1[29] <= 21'b0; + tag_way1[30] <= 21'b0; + tag_way1[31] <= 21'b0; + tag_way1[32] <= 21'b0; + tag_way1[33] <= 21'b0; + tag_way1[34] <= 21'b0; + tag_way1[35] <= 21'b0; + tag_way1[36] <= 21'b0; + tag_way1[37] <= 21'b0; + tag_way1[38] <= 21'b0; + tag_way1[39] <= 21'b0; + tag_way1[40] <= 21'b0; + tag_way1[41] <= 21'b0; + tag_way1[42] <= 21'b0; + tag_way1[43] <= 21'b0; + tag_way1[44] <= 21'b0; + tag_way1[45] <= 21'b0; + tag_way1[46] <= 21'b0; + tag_way1[47] <= 21'b0; + tag_way1[48] <= 21'b0; + tag_way1[49] <= 21'b0; + tag_way1[50] <= 21'b0; + tag_way1[51] <= 21'b0; + tag_way1[52] <= 21'b0; + tag_way1[53] <= 21'b0; + tag_way1[54] <= 21'b0; + tag_way1[55] <= 21'b0; + tag_way1[56] <= 21'b0; + tag_way1[57] <= 21'b0; + tag_way1[58] <= 21'b0; + tag_way1[59] <= 21'b0; + tag_way1[60] <= 21'b0; + tag_way1[61] <= 21'b0; + tag_way1[62] <= 21'b0; + tag_way1[63] <= 21'b0; + end + else if (refresh & lru_r[index]) begin + tag_way1[index] <= {cached_v, tag}; + end + end + + assign lru = lru_r[index]; + assign hit = {hit_way1, hit_way0}; + + assign hit_way0 = ~flush & cached_v & sram_en & ({1'b1,tag} == tag_way0[index]); + assign hit_way1 = ~flush & cached_v & sram_en & ({1'b1,tag} == tag_way1[index]); + + assign miss = cached_v & sram_en & ~(hit_way0 | hit_way1) & ~flush; + + assign stallreq = miss; + + assign axi_raddr = cached_v ? {sram_addr[31:6], 6'b0} : sram_addr; + assign write_back = flush ? 1'b0 : lru ? write_back_way1 : write_back_way0; + + assign write_back_way0 = cached_v & sram_en & miss & tag_way0[index][TAG_WD -1]; + assign write_back_way1 = cached_v & sram_en & miss & tag_way1[index][TAG_WD -1]; + + assign axi_waddr = lru_r[index] ? axi_waddr_way1 : axi_waddr_way0; + + assign axi_waddr_way0 = {tag_way0[index][TAG_WD -2:0], + index, + 6'b0 + }; + assign axi_waddr_way1 = {tag_way1[index][TAG_WD -2:0], + index, + 6'b0 + }; +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/dcache.v b/lacpu/rtl/cpu/dcache.v new file mode 100644 index 0000000..00b7a4f --- /dev/null +++ b/lacpu/rtl/cpu/dcache.v @@ -0,0 +1,65 @@ +module dcache +#( + parameter HIT_WD = 2, + parameter LRU_WD = 1, + parameter CACHELINE_WD = 512 +) +( + input clk, + input reset, + input data_sram_en, + input [ 3:0] data_sram_we, + input [31:0] data_sram_addr, + input [31:0] data_sram_wdata, + input dcache_refresh, + input dcache_uncached, + input [CACHELINE_WD -1:0] dcache_cacheline_new, + + output stallreq_dcache, + output [31:0] data_sram_rdata, + output dcache_miss, + output [31:0] dcache_raddr, + output [31:0] dcache_waddr, + output dcache_write_back, + output [CACHELINE_WD -1:0] dcache_cacheline_old +); + + wire [HIT_WD -1:0] dcache_hit; + wire [LRU_WD -1:0] dcache_lru; + + + cache_tag_v5 u_dcache_tag( + .clk (clk ), + .reset (reset ), + .flush (1'b0 ), + .stallreq (stallreq_dcache ), + .cached (~dcache_uncached ), // ? TODO from tlb + .sram_en (data_sram_en/* & ~d_refill & ~d_invalid & ~d_modify*/), // TODO! + .sram_we (data_sram_we ), + .sram_addr (data_sram_addr ), // _mmu ? + .refresh (dcache_refresh ), + .miss (dcache_miss ), + .axi_raddr (dcache_raddr ), + .write_back (dcache_write_back ), + .axi_waddr (dcache_waddr ), + .hit (dcache_hit ), + .lru (dcache_lru ) + ); + + cache_data_v5 u_dcache_data( + .clk (clk ), + .reset (reset ), + .write_back (dcache_write_back ), + .hit (dcache_hit ), + .lru (dcache_lru ), + .cached (~dcache_uncached ), // ? from tlb + .sram_en (data_sram_en/* & ~d_refill & ~d_invalid & ~d_modify*/), // TODO! + .sram_we (data_sram_we ), + .sram_addr (data_sram_addr ), // _mmu ? + .sram_wdata (data_sram_wdata ), + .sram_rdata (data_sram_rdata ), + .refresh (dcache_refresh ), + .cacheline_new (dcache_cacheline_new ), + .cacheline_old (dcache_cacheline_old ) + ); +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/icache.v b/lacpu/rtl/cpu/icache.v new file mode 100644 index 0000000..646d1ad --- /dev/null +++ b/lacpu/rtl/cpu/icache.v @@ -0,0 +1,63 @@ +module icache +#( + parameter HIT_WD = 2, + parameter LRU_WD = 1, + parameter CACHELINE_WD = 512 +) +( + input clk, + input reset, + input inst_sram_en, + input [ 3:0] inst_sram_we, + input [31:0] inst_sram_addr, + input [31:0] inst_sram_wdata, + input icache_refresh, + input [CACHELINE_WD -1:0] icache_cacheline_new, + + output stallreq_icache, + output [31:0] inst_sram_rdata, + output icache_miss, + output [31:0] icache_raddr, + output [31:0] icache_waddr, + output [CACHELINE_WD -1:0] icache_cacheline_old +); + + wire [HIT_WD -1:0] icache_hit; + wire [LRU_WD -1:0] icache_lru; + + cache_tag_v5 u_icache_tag( + .clk (clk ), + .reset (reset ), + .flush (1'b0 ), + .stallreq (stallreq_icache ), + .cached (1'b1 ), + .sram_en (inst_sram_en/* & ~i_refill & ~i_invalid*/ ), // TODO! + .sram_we (inst_sram_we ), + .sram_addr (inst_sram_addr ), // _mmu ? + .refresh (icache_refresh ), + .miss (icache_miss ), + .axi_raddr (icache_raddr ), + .write_back (/*icache_write_back*/ ), // no use + .axi_waddr (icache_waddr ), + .hit (icache_hit ), + .lru (icache_lru ) + ); + + cache_data_v5 u_icache_data( + .clk (clk ), + .reset (reset ), + .write_back (1'b0 ), + .hit (icache_hit ), + .lru (icache_lru ), + .cached (1'b1 ), + .sram_en (inst_sram_en/* & ~i_refill & ~i_invalid*/ ), // TODO! + .sram_we (inst_sram_we ), + .sram_addr (inst_sram_addr ), + .sram_wdata (inst_sram_wdata ), + .sram_rdata (inst_sram_rdata ), + .refresh (icache_refresh ), + .cacheline_new (icache_cacheline_new ), + .cacheline_old (icache_cacheline_old ) + ); + +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/mmu.v b/lacpu/rtl/cpu/mmu.v new file mode 100644 index 0000000..d810f57 --- /dev/null +++ b/lacpu/rtl/cpu/mmu.v @@ -0,0 +1,21 @@ +module mmu ( + input [31:0] addr_i, + output [31:0] addr_o, + output cache_v +); + wire [1:0] addr_head_i, addr_head_o; + assign addr_head_i = addr_i[31:30]; + + wire kseg0_l, kseg0_h, kseg1_l, kseg1_h; + assign kseg0_l = addr_head_i == 2'b00; + assign kseg0_h = addr_head_i == 2'b01; + assign kseg1_l = addr_head_i == 2'b10; + assign kseg1_h = addr_head_i == 2'b11; + + wire other_seg; + assign other_seg = ~kseg0_l & ~kseg0_h & ~kseg1_l & ~kseg1_h; + assign addr_head_o = {2{kseg0_l}}&2'b00 | {2{kseg0_h}}&2'b01 | {2{kseg1_l}}&2'b10 | {2{kseg1_h}}&2'b11 | {2{other_seg}}&addr_head_i; + assign addr_o = {addr_head_o, addr_i[29:0]}; + + assign cache_v = ~(kseg0_l|kseg1_l|kseg1_h); +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/mycpu_core.v b/lacpu/rtl/cpu/mycpu_core.v new file mode 100644 index 0000000..a6e992d --- /dev/null +++ b/lacpu/rtl/cpu/mycpu_core.v @@ -0,0 +1,167 @@ +`default_nettype wire + +module mycpu_core +#( + parameter FS_TO_DS_BUS_WD = 65, + parameter DS_TO_ES_BUS_WD = 301, + parameter ES_TO_MS_BUS_WD = 271, + parameter MS_TO_WS_BUS_WD = 102, + parameter WS_TO_RF_BUS_WD = 38, + + parameter MS_TO_ES_BUS_WD = 38, + parameter WS_TO_ES_BUS_WD = 38, + parameter BR_BUS_WD = 33 + +) +( + input clk, + input resetn, + output timer_int, + + // inst sram interface + output inst_sram_en, + output [ 3:0] inst_sram_we, + output [31:0] inst_sram_addr, + output [31:0] inst_sram_wdata, + input [31:0] inst_sram_rdata, + // data sram interface + output data_sram_en, + output [ 3:0] data_sram_we, + output [31:0] data_sram_addr, + output [31:0] data_sram_wdata, + input [31:0] data_sram_rdata, + // cache + input stallreq_dcache, + input stallreq_icache, + input stallreq_uncache, + // trace debug interface + output [31:0] debug_wb_pc, + output [ 3:0] debug_wb_rf_we, + output [ 4:0] debug_wb_rf_wnum, + output [31:0] debug_wb_rf_wdata +); + + reg reset; + always @(posedge clk) reset <= ~resetn; + + wire [FS_TO_DS_BUS_WD -1:0] fs_to_ds_bus; + wire [DS_TO_ES_BUS_WD -1:0] ds_to_es_bus; + wire [ES_TO_MS_BUS_WD -1:0] es_to_ms_bus; + wire [MS_TO_WS_BUS_WD -1:0] ms_to_ws_bus; + wire [WS_TO_RF_BUS_WD -1:0] ws_to_rf_bus; + + wire [MS_TO_ES_BUS_WD -1:0] ms_to_es_bus; + wire [WS_TO_ES_BUS_WD -1:0] ws_to_es_bus; + + wire [BR_BUS_WD -1:0] br_bus; + + wire flush; + wire stallreq_es; + wire stallreq_ds; + wire [ 5:0] stall; + wire except_en; + wire [31:0] new_pc; + + wire [ 1:0] csr_plv; + wire csr_has_int; + + wire stallreq_cache; + + assign stallreq_cache = stallreq_dcache | stallreq_icache | stallreq_uncache; + + if_stage if_stage( + .clk (clk ), + .reset (reset ), + .flush (flush ), + .stall (stall ), + .new_pc (new_pc ), + .timer_int (timer_int ), + .fs_to_ds_bus (fs_to_ds_bus ), + .br_bus (br_bus ), + .inst_sram_en (inst_sram_en ), + .inst_sram_we (inst_sram_we ), + .inst_sram_addr (inst_sram_addr ), + .inst_sram_wdata (inst_sram_wdata ) + ); + + id_stage id_stage( + .clk (clk ), + .reset (reset ), + .flush (flush ), + .stall (stall ), + .br_taken (br_bus[32] ), + .stallreq_ds (stallreq_ds ), + .fs_to_ds_bus (fs_to_ds_bus ), + .pc_valid (inst_sram_en ), + .inst_sram_rdata (inst_sram_rdata ), + .csr_plv (csr_plv ), + .csr_has_int (csr_has_int ), + .ws_to_rf_bus (ws_to_rf_bus ), + .ds_to_es_bus (ds_to_es_bus ) + ); + + exe_stage exe_stage( + .clk (clk ), + .reset (reset ), + .flush (flush ), + .stall (stall ), + .stallreq_es (stallreq_es ), + + .ds_to_es_bus (ds_to_es_bus ), + .es_to_ms_bus (es_to_ms_bus ), + .ms_to_es_bus (ms_to_es_bus ), + .ws_to_es_bus (ws_to_es_bus ), + + .br_bus (br_bus ), + + .data_sram_en (data_sram_en ), + .data_sram_we (data_sram_we ), + .data_sram_addr (data_sram_addr ), + .data_sram_wdata (data_sram_wdata ) + ); + + mem_stage mem_stage( + .clk (clk ), + .reset (reset ), + .flush (flush ), + .stall (stall ), + .except_en (except_en ), + .new_pc (new_pc ), + .csr_plv (csr_plv ), + .csr_has_int (csr_has_int ), + + .es_to_ms_bus (es_to_ms_bus ), + .ms_to_es_bus (ms_to_es_bus ), + .ms_to_ws_bus (ms_to_ws_bus ), + + .data_sram_rdata (data_sram_rdata ) + ); + + wb_stage wb_stage( + .clk (clk ), + .reset (reset ), + .flush (flush ), + .stall (stall ), + + .ms_to_ws_bus (ms_to_ws_bus ), + .ws_to_rf_bus (ws_to_rf_bus ), + .ws_to_es_bus (ws_to_es_bus ), + + .debug_wb_pc (debug_wb_pc ), + .debug_wb_rf_we (debug_wb_rf_we ), + .debug_wb_rf_wnum (debug_wb_rf_wnum ), + .debug_wb_rf_wdata (debug_wb_rf_wdata) + ); + + pip_ctrl pip_ctrl( + .reset (reset ), + .except_en (except_en ), + .stallreq_ds (stallreq_ds ), + .stallreq_es (stallreq_es ), + .stallreq_axi (1'b0 ), // TODO! + .stallreq_cache (stallreq_cache ), + .flush (flush ), + .stall (stall ) + ); + +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/mycpu_top.v b/lacpu/rtl/cpu/mycpu_top.v index 0fc4124..a080088 100644 --- a/lacpu/rtl/cpu/mycpu_top.v +++ b/lacpu/rtl/cpu/mycpu_top.v @@ -1,33 +1,69 @@ +`default_nettype wire + module mycpu_top #( - parameter FS_TO_DS_BUS_WD = 65, - parameter DS_TO_ES_BUS_WD = 301, - parameter ES_TO_MS_BUS_WD = 271, - parameter MS_TO_WS_BUS_WD = 102, - parameter WS_TO_RF_BUS_WD = 38, - - parameter MS_TO_ES_BUS_WD = 38, - parameter WS_TO_ES_BUS_WD = 38, - parameter BR_BUS_WD = 33 - + parameter HIT_WD = 2, + parameter LRU_WD = 1, + parameter CACHELINE_WD = 512 ) ( - input clk, - input resetn, + input aclk, + input aresetn, output timer_int, - // inst sram interface - output inst_sram_en, - output [ 3:0] inst_sram_we, - output [31:0] inst_sram_addr, - output [31:0] inst_sram_wdata, - input [31:0] inst_sram_rdata, - // data sram interface - output data_sram_en, - output [ 3:0] data_sram_we, - output [31:0] data_sram_addr, - output [31:0] data_sram_wdata, - input [31:0] data_sram_rdata, + output [ 3:0] arid, + output [31:0] araddr, + output [ 3:0] arlen, + output [ 2:0] arsize, + output [ 1:0] arburst, + output [ 1:0] arlock, + output [ 3:0] arcache, + output [ 2:0] arprot, + output arvalid, + input arready, + + input [ 3:0] rid, + input [31:0] rdata, + input [ 1:0] rresp, + input rlast, + input rvalid, + output rready, + + output [ 3:0] awid, + output [31:0] awaddr, + output [ 3:0] awlen, + output [ 2:0] awsize, + output [ 1:0] awburst, + output [ 1:0] awlock, + output [ 3:0] awcache, + output [ 2:0] awprot, + output awvalid, + input awready, + + output [ 3:0] wid, + output [31:0] wdata, + output [ 3:0] wstrb, + output wlast, + output wvalid, + input wready, + + input [ 3:0] bid, + input [ 1:0] bresp, + input bvalid, + output bready, + + // // inst sram interface + // output inst_sram_en, + // output [ 3:0] inst_sram_we, + // output [31:0] inst_sram_addr, + // output [31:0] inst_sram_wdata, + // input [31:0] inst_sram_rdata, + // // data sram interface + // output data_sram_en, + // output [ 3:0] data_sram_we, + // output [31:0] data_sram_addr, + // output [31:0] data_sram_wdata, + // input [31:0] data_sram_rdata, // trace debug interface output [31:0] debug_wb_pc, output [ 3:0] debug_wb_rf_we, @@ -35,122 +71,239 @@ module mycpu_top output [31:0] debug_wb_rf_wdata ); - reg reset; - always @(posedge clk) reset <= ~resetn; + wire inst_sram_en; + wire [ 3:0] inst_sram_we; + wire [31:0] inst_sram_addr; + wire [31:0] inst_sram_wdata; + wire [31:0] inst_sram_rdata; - wire [FS_TO_DS_BUS_WD -1:0] fs_to_ds_bus; - wire [DS_TO_ES_BUS_WD -1:0] ds_to_es_bus; - wire [ES_TO_MS_BUS_WD -1:0] es_to_ms_bus; - wire [MS_TO_WS_BUS_WD -1:0] ms_to_ws_bus; - wire [WS_TO_RF_BUS_WD -1:0] ws_to_rf_bus; + wire data_sram_en; + wire [ 3:0] data_sram_we; + wire [31:0] data_sram_addr; + wire [31:0] data_sram_wdata; + wire [31:0] data_sram_rdata; - wire [MS_TO_ES_BUS_WD -1:0] ms_to_es_bus; - wire [WS_TO_ES_BUS_WD -1:0] ws_to_es_bus; + wire clk; + wire resetn; - wire [BR_BUS_WD -1:0] br_bus; + assign clk = aclk; + assign resetn = aresetn; - wire flush; - wire stallreq_es; - wire stallreq_ds; - wire [ 5:0] stall; - wire except_en; - wire [31:0] new_pc; + // icache tag + wire icache_cached; + wire icache_uncached; + wire icache_refresh; + wire icache_miss; + wire [31:0] icache_raddr; + //wire icache_write_back; + wire [31:0] icache_waddr; + // icache data + wire [CACHELINE_WD -1:0] icache_cacheline_new; + wire [CACHELINE_WD -1:0] icache_cacheline_old; - wire [ 1:0] csr_plv; - wire csr_has_int; - if_stage if_stage( - .clk (clk ), - .reset (reset ), - .flush (flush ), - .stall (stall ), - .new_pc (new_pc ), - .timer_int (timer_int ), - .fs_to_ds_bus (fs_to_ds_bus ), - .br_bus (br_bus ), - .inst_sram_en (inst_sram_en ), - .inst_sram_we (inst_sram_we ), - .inst_sram_addr (inst_sram_addr ), - .inst_sram_wdata (inst_sram_wdata ) + // dcache tag + wire dcache_cached; + wire dcache_uncached; + wire dcache_refresh; + wire dcache_miss; + wire [31:0] dcache_raddr; + wire dcache_write_back; + wire [31:0] dcache_waddr; + // dcache data + wire [CACHELINE_WD -1:0] dcache_cacheline_new; + wire [CACHELINE_WD -1:0] dcache_cacheline_old; + + // uncache tag + wire uncache_refresh; + wire uncache_en; + wire [ 3:0] uncache_we; + wire [31:0] uncache_addr; + wire [31:0] uncache_wdata; + // uncache data + wire [31:0] uncache_rdata; + + + wire [31:0] data_sram_addr_mmu; + + wire [31:0] dcache_temp_rdata; + wire [31:0] uncache_temp_rdata; + wire stallreq_icache; + wire stallreq_dcache; + wire stallreq_uncache; + + mycpu_core mycpu_core( + .clk (clk ), + .resetn (resetn ), + + .inst_sram_en (inst_sram_en ), + .inst_sram_we (inst_sram_we ), + .inst_sram_addr (inst_sram_addr ), + .inst_sram_wdata (inst_sram_wdata ), + .inst_sram_rdata (inst_sram_rdata ), + + .data_sram_en (data_sram_en ), + .data_sram_we (data_sram_we ), + .data_sram_addr (data_sram_addr ), + .data_sram_wdata (data_sram_wdata ), + .data_sram_rdata (data_sram_rdata ), + + .stallreq_dcache (stallreq_dcache ), + .stallreq_icache (stallreq_icache ), + .stallreq_uncache (stallreq_uncache ), + + .debug_wb_pc (debug_wb_pc ), + .debug_wb_rf_we (debug_wb_rf_we ), + .debug_wb_rf_wnum (debug_wb_rf_wnum ), + .debug_wb_rf_wdata (debug_wb_rf_wdata ) + ); - id_stage id_stage( - .clk (clk ), - .reset (reset ), - .flush (flush ), - .stall (stall ), - .br_taken (br_bus[32] ), - .stallreq_ds (stallreq_ds ), - .fs_to_ds_bus (fs_to_ds_bus ), - .pc_valid (inst_sram_en ), - .inst_sram_rdata (inst_sram_rdata ), - .csr_plv (csr_plv ), - .csr_has_int (csr_has_int ), - .ws_to_rf_bus (ws_to_rf_bus ), - .ds_to_es_bus (ds_to_es_bus ) + icache icache( + .clk (clk ), + .reset (~resetn ), + .inst_sram_en (inst_sram_en ), + .inst_sram_we (inst_sram_we ), + .inst_sram_addr (inst_sram_addr ), + .inst_sram_wdata (inst_sram_wdata ), + .icache_refresh (icache_refresh ), + .icache_cacheline_new (icache_cacheline_new), + + .stallreq_icache (stallreq_icache ), + .inst_sram_rdata (inst_sram_rdata ), + .icache_miss (icache_miss ), + .icache_raddr (icache_raddr ), + .icache_waddr (icache_waddr ), + .icache_cacheline_old (icache_cacheline_old) ); - exe_stage exe_stage( - .clk (clk ), - .reset (reset ), - .flush (flush ), - .stall (stall ), - .stallreq_es (stallreq_es ), - - .ds_to_es_bus (ds_to_es_bus ), - .es_to_ms_bus (es_to_ms_bus ), - .ms_to_es_bus (ms_to_es_bus ), - .ws_to_es_bus (ws_to_es_bus ), - - .br_bus (br_bus ), - - .data_sram_en (data_sram_en ), - .data_sram_we (data_sram_we ), - .data_sram_addr (data_sram_addr ), - .data_sram_wdata (data_sram_wdata ) + dcache dcache( + .clk (clk ), + .reset (~resetn ), + .data_sram_en (data_sram_en ), + .data_sram_we (data_sram_we ), + .data_sram_addr (data_sram_addr_mmu ), + .data_sram_wdata (data_sram_wdata ), + .dcache_refresh (dcache_refresh ), + .dcache_uncached (dcache_uncached ), + .dcache_cacheline_new (dcache_cacheline_new), + + .stallreq_dcache (stallreq_dcache ), + .data_sram_rdata (dcache_temp_rdata ), + .dcache_miss (dcache_miss ), + .dcache_raddr (dcache_raddr ), + .dcache_waddr (dcache_waddr ), + .dcache_write_back (dcache_write_back ), + .dcache_cacheline_old (dcache_cacheline_old) ); - mem_stage mem_stage( - .clk (clk ), - .reset (reset ), - .flush (flush ), - .stall (stall ), - .except_en (except_en ), - .new_pc (new_pc ), - .csr_plv (csr_plv ), - .csr_has_int (csr_has_int ), - - .es_to_ms_bus (es_to_ms_bus ), - .ms_to_es_bus (ms_to_es_bus ), - .ms_to_ws_bus (ms_to_ws_bus ), - - .data_sram_rdata (data_sram_rdata ) + uncache uncache( + .clk (clk ), + .resetn (resetn ), + .stallreq (stallreq_uncache ), + .conf_en (data_sram_en & ~dcache_cached ), + .conf_we (data_sram_we ), + .conf_addr (data_sram_addr_mmu ), // _mmu ? + .conf_wdata (data_sram_wdata ), + .conf_rdata (uncache_temp_rdata ), + .axi_en (uncache_en ), + .axi_wsel (uncache_we ), + .axi_addr (uncache_addr ), + .axi_wdata (uncache_wdata ), + .reload (uncache_refresh ), + .axi_rdata (uncache_rdata ) ); - wb_stage wb_stage( - .clk (clk ), - .reset (reset ), - .flush (flush ), - .stall (stall ), + reg dcache_cached_r; + //assign dcache_cached = ~dcache_uncached; + assign dcache_uncached = ~dcache_cached; + always @ (posedge clk) begin + dcache_cached_r <= dcache_cached; + end + assign data_sram_rdata = dcache_cached_r ? dcache_temp_rdata : uncache_temp_rdata; - .ms_to_ws_bus (ms_to_ws_bus ), - .ws_to_rf_bus (ws_to_rf_bus ), - .ws_to_es_bus (ws_to_es_bus ), - .debug_wb_pc (debug_wb_pc ), - .debug_wb_rf_we (debug_wb_rf_we ), - .debug_wb_rf_wnum (debug_wb_rf_wnum ), - .debug_wb_rf_wdata (debug_wb_rf_wdata) + // mmu u_inst_mmu( + // .addr_i (inst_sram_addr ), + // .addr_o (inst_sram_addr_mmu ), + // .cache_v (icache_cached ) + // ); + mmu data_mmu( + .addr_i (data_sram_addr ), + .addr_o (data_sram_addr_mmu ), + .cache_v (dcache_cached ) ); - pip_ctrl pip_ctrl( - .reset (reset ), - .except_en (except_en ), - .stallreq_ds (stallreq_ds ), - .stallreq_es (stallreq_es ), - .stallreq_axi (1'b0 ), // TODO! - .flush (flush ), - .stall (stall ) + + // cache signal from tlb + // begin + //assign dcache_uncached = 1'b0; + + // end + + axi_ctrl_v5 axi_ctrl( + .clk (clk ), + .reset (~resetn ), + + .icache_re (icache_miss ), + .icache_raddr (icache_raddr ), + .icache_cacheline_new (icache_cacheline_new ), + .icache_we (1'b0 ), + .icache_waddr (icache_waddr ), + .icache_cacheline_old (icache_cacheline_old ), + .icache_refresh (icache_refresh ), + + .dcache_re (dcache_miss ), + .dcache_raddr (dcache_raddr ), + .dcache_cacheline_new (dcache_cacheline_new ), + .dcache_we (dcache_write_back ), + .dcache_waddr (dcache_waddr ), + .dcache_cacheline_old (dcache_cacheline_old ), + .dcache_refresh (dcache_refresh ), + + .uncache_en (uncache_en ), + .uncache_we (uncache_we ), + .uncache_addr (uncache_addr ), + .uncache_wdata (uncache_wdata ), + .uncache_rdata (uncache_rdata ), + .uncache_refresh (uncache_refresh ), + + .arid (arid ), + .araddr (araddr ), + .arlen (arlen ), + .arsize (arsize ), + .arburst (arburst ), + .arlock (arlock ), + .arcache (arcache ), + .arprot (arprot ), + .arvalid (arvalid ), + .arready (arready ), + .rid (rid ), + .rdata (rdata ), + .rresp (rresp ), + .rlast (rlast ), + .rvalid (rvalid ), + .rready (rready ), + .awid (awid ), + .awaddr (awaddr ), + .awlen (awlen ), + .awsize (awsize ), + .awburst (awburst ), + .awlock (awlock ), + .awcache (awcache ), + .awprot (awprot ), + .awvalid (awvalid ), + .awready (awready ), + .wid (wid ), + .wdata (wdata ), + .wstrb (wstrb ), + .wlast (wlast ), + .wvalid (wvalid ), + .wready (wready ), + .bid (bid ), + .bresp (bresp ), + .bvalid (bvalid ), + .bready (bready ) ); endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/pip_ctrl.v b/lacpu/rtl/cpu/pip_ctrl.v index 2d13162..f3a89f5 100644 --- a/lacpu/rtl/cpu/pip_ctrl.v +++ b/lacpu/rtl/cpu/pip_ctrl.v @@ -5,6 +5,7 @@ module pip_ctrl( input stallreq_ds, input stallreq_es, input stallreq_axi, + input stallreq_cache, output reg flush, output reg [`StallBus-1:0] stall ); @@ -36,6 +37,10 @@ module pip_ctrl( flush = 0; stall = `StallBus'b011111; end + else if(stallreq_cache) begin + flush = 0; + stall = `StallBus'b111111; + end else begin flush = 0; stall = `StallBus'b000000; diff --git a/lacpu/rtl/cpu/uncache.v b/lacpu/rtl/cpu/uncache.v new file mode 100644 index 0000000..46e757b --- /dev/null +++ b/lacpu/rtl/cpu/uncache.v @@ -0,0 +1,131 @@ +`default_nettype wire + +module uncache +#( + parameter STAGE_WD = 4, + parameter WAIT = 4'b1000, + parameter IDLE = 4'b0001, + parameter BUFFER = 4'b0010 +) +( + input clk, + input resetn, + output stallreq, + + input conf_en, + input [ 3:0] conf_we, + input [31:0] conf_addr, + input [31:0] conf_wdata, + output reg [31:0] conf_rdata, + + output reg axi_en, // en + output reg [ 3:0] axi_wsel, // we + output reg [31:0] axi_addr, // addr + output reg [31:0] axi_wdata, + + input reload, + input [31:0] axi_rdata +); + reg valid; + reg finish; + reg buffer_valid; + reg [STAGE_WD -1:0] stage; + + wire conf_rd_req; + wire conf_wr_req; + + assign conf_rd_req = conf_en & ~valid & ~(|conf_we); + assign conf_wr_req = conf_en & ~valid & (|conf_we); + + assign stallreq = conf_rd_req & ~valid | conf_wr_req & buffer_valid & ~valid | stage[3]; + always @ (posedge clk) begin + if (!resetn) begin + valid <= 1'b0; + end + else if (finish) begin + valid <= 1'b1; + end + else begin + valid <= 1'b0; + end + end + + // assign rd_req = conf_en & ~valid & ~(|conf_we); + // assign rd_addr = conf_addr; + // assign wr_req = conf_en & ~valid & (|conf_we); + // assign wr_wstrb = conf_we; + // assign wr_addr = conf_addr; + // assign wr_data = conf_wdata; + + always @ (posedge clk) begin + if (!resetn) begin + conf_rdata <= 32'b0; + end + else if (reload) begin + conf_rdata <= axi_rdata; + end + end + + always @ (posedge clk) begin + if (!resetn) begin + buffer_valid <= 1'b0; + + stage <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + finish <= 1'b0; + + axi_en <= 1'b0; + axi_wsel <= 4'b0; + axi_addr <= 32'b0; + axi_wdata <= 32'b0; + end + else begin + case(1'b1) + stage[0]:begin + if (conf_rd_req & ~buffer_valid) begin + axi_en <= 1'b1; + axi_wsel <= conf_we; + axi_addr <= conf_addr; + axi_wdata <= conf_wdata; + stage <= WAIT; + end + else if (conf_wr_req & ~buffer_valid) begin + axi_en <= 1'b1; + axi_wsel <= conf_we; + axi_addr <= conf_addr; + axi_wdata <= conf_wdata; + buffer_valid <= 1'b1; + // finish <= 1'b1; + stage <= BUFFER; + end + end + stage[1]:begin //BUFFER + // finish <= 1'b0; + if (reload) begin + buffer_valid <= 1'b0; + axi_en <= 1'b0; + axi_wsel <= 4'b0; + axi_addr <= 32'b0; + axi_wdata <= 32'b0; + stage <= IDLE; + end + end + stage[3]:begin + if (reload) begin + axi_en <= 1'b0; + axi_wsel <= 4'b0; + axi_addr <= 32'b0; + axi_wdata <= 32'b0; + finish <= 1'b1; + end + else if (finish) begin + finish <= 1'b0; + stage <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + end + end + default:begin + stage <= {{(STAGE_WD-1){1'b0}}, 1'b1}; + end + endcase + end + end +endmodule \ No newline at end of file diff --git a/lacpu/rtl/cpu/wb_stage.v b/lacpu/rtl/cpu/wb_stage.v index a4761b3..c86f85d 100755 --- a/lacpu/rtl/cpu/wb_stage.v +++ b/lacpu/rtl/cpu/wb_stage.v @@ -60,9 +60,9 @@ module wb_stage end - assign debug_wb_pc = ws_pc; - assign debug_wb_rf_we = {4{reg_we}}; - assign debug_wb_rf_wnum = dest; - assign debug_wb_rf_wdata = ms_final_result; + assign debug_wb_pc = stall[5] ? 0 : ws_pc; + assign debug_wb_rf_we = stall[5] ? 0 : {4{reg_we}}; + assign debug_wb_rf_wnum = stall[5] ? 0 : dest; + assign debug_wb_rf_wdata = stall[5] ? 0 : ms_final_result; endmodule \ No newline at end of file diff --git a/lacpu/rtl/soc_lite_top.v b/lacpu/rtl/soc_lite_top.v index 9ca9e0e..5007fba 100755 --- a/lacpu/rtl/soc_lite_top.v +++ b/lacpu/rtl/soc_lite_top.v @@ -1,96 +1,606 @@ -module soc_lite_top -( - input resetn, - input clk, - output [15:0] pc -); - //debug signals - wire [31:0] debug_wb_pc; - wire [3 :0] debug_wb_rf_wen; - wire [4 :0] debug_wb_rf_wnum; - wire [31:0] debug_wb_rf_wdata; - - //clk and resetn - wire cpu_clk; - reg cpu_resetn; - - assign pc = debug_wb_pc[15:0]; - //assign cpu_clk = clk; - always @(posedge cpu_clk) - begin - cpu_resetn <= resetn; - end - - pll pll( - .clk_in1(clk), - .clk_out1(cpu_clk) - ); - - - //cpu inst sram - wire cpu_inst_en; - wire [3 :0] cpu_inst_wen; - wire [31:0] cpu_inst_addr; - wire [31:0] cpu_inst_wdata; - wire [31:0] cpu_inst_rdata; - //cpu data sram - wire cpu_data_en; - wire [3 :0] cpu_data_wen; - wire [31:0] cpu_data_addr; - wire [31:0] cpu_data_wdata; - wire [31:0] cpu_data_rdata; - - //cpu - mycpu_top mycpu_top( - .clk (cpu_clk ), - .resetn (cpu_resetn), //low active - - .inst_sram_en (cpu_inst_en ), - .inst_sram_we (cpu_inst_wen ), - .inst_sram_addr (cpu_inst_addr ), - .inst_sram_wdata (cpu_inst_wdata), - .inst_sram_rdata (cpu_inst_rdata), - - .data_sram_en (cpu_data_en ), - .data_sram_we (cpu_data_wen ), - .data_sram_addr (cpu_data_addr ), - .data_sram_wdata (cpu_data_wdata), - .data_sram_rdata (cpu_data_rdata), - - //debug - .debug_wb_pc (debug_wb_pc ), - .debug_wb_rf_we (debug_wb_rf_wen ), - .debug_wb_rf_wnum (debug_wb_rf_wnum ), - .debug_wb_rf_wdata(debug_wb_rf_wdata) - ); - - - `ifdef DPIC - - - `else - //inst ram - inst_ram inst_ram - ( - .clka (cpu_clk ), - .ena (cpu_inst_en ), - .wea (cpu_inst_wen ), //3:0 - .addra (cpu_inst_addr[17:2]), //15:0 - .dina (cpu_inst_wdata ), //31:0 - .douta (cpu_inst_rdata ) //31:0 - ); - - //data ram - data_ram data_ram - ( - .clka (cpu_clk ), - .ena (cpu_data_en ), - .wea (cpu_data_wen ), //3:0 - .addra (cpu_data_addr[17:2]), //15:0 - .dina (cpu_data_wdata ), //31:0 - .douta (cpu_data_rdata ) //31:0 - ); - `endif - -endmodule - +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +//************************************************************************* +// > File Name : soc_top.v +// > Description : SoC, included cpu, 2 x 3 bridge, +// inst ram, confreg, data ram +// +// ------------------------- +// | cpu | +// ------------------------- +// inst| | data +// | | +// | --------------------- +// | | 1 x 2 bridge | +// | --------------------- +// | | | +// | | | +// ------------- ----------- ----------- +// | inst ram | | data ram| | confreg | +// ------------- ----------- ----------- +// +// > Author : LOONGSON +// > Date : 2017-08-04 +//************************************************************************* + +`default_nettype none + +//for simulation: +//1. if define SIMU_USE_PLL = 1, will use clk_pll to generate cpu_clk/timer_clk, +// and simulation will be very slow. +//2. usually, please define SIMU_USE_PLL=0 to speed up simulation by assign +// cpu_clk/timer_clk = clk. +// at this time, cpu_clk/timer_clk frequency are both 100MHz, same as clk. +`define SIMU_USE_PLL 0 //set 0 to speed up simulation + +module soc_lite_top #(parameter SIMULATION=1'b0) +( + input wire resetn, + input wire clk, + + //------gpio------- + output wire [15:0] led, + output wire [1 :0] led_rg0, + output wire [1 :0] led_rg1, + output wire [7 :0] num_csn, + output wire [6 :0] num_a_g, + output wire [31:0] num_data, + input wire [7 :0] switch, + output wire [3 :0] btn_key_col, + input wire [3 :0] btn_key_row, + input wire [1 :0] btn_step +); +//debug signals +wire [31:0] debug_wb_pc; +wire [3 :0] debug_wb_rf_we; +wire [4 :0] debug_wb_rf_wnum; +wire [31:0] debug_wb_rf_wdata; + +//clk and resetn +wire cpu_clk; +wire timer_clk; +reg cpu_resetn; +always @(posedge cpu_clk) +begin + cpu_resetn <= resetn; +end +generate if(SIMULATION && `SIMU_USE_PLL==0) +begin: speedup_simulation + assign cpu_clk = clk; + assign timer_clk = clk; +end +else +begin: pll + clk_pll clk_pll + ( + .clk_in1 (clk), + .cpu_clk (cpu_clk), + .timer_clk (timer_clk) + ); +end +endgenerate + +//cpu axi +wire [3 :0] cpu_arid ; +wire [31:0] cpu_araddr ; +wire [7 :0] cpu_arlen ; +wire [2 :0] cpu_arsize ; +wire [1 :0] cpu_arburst; +wire [1 :0] cpu_arlock ; +wire [3 :0] cpu_arcache; +wire [2 :0] cpu_arprot ; +wire cpu_arvalid; +wire cpu_arready; +wire [3 :0] cpu_rid ; +wire [31:0] cpu_rdata ; +wire [1 :0] cpu_rresp ; +wire cpu_rlast ; +wire cpu_rvalid ; +wire cpu_rready ; +wire [3 :0] cpu_awid ; +wire [31:0] cpu_awaddr ; +wire [7 :0] cpu_awlen ; +wire [2 :0] cpu_awsize ; +wire [1 :0] cpu_awburst; +wire [1 :0] cpu_awlock ; +wire [3 :0] cpu_awcache; +wire [2 :0] cpu_awprot ; +wire cpu_awvalid; +wire cpu_awready; +wire [3 :0] cpu_wid ; +wire [31:0] cpu_wdata ; +wire [3 :0] cpu_wstrb ; +wire cpu_wlast ; +wire cpu_wvalid ; +wire cpu_wready ; +wire [3 :0] cpu_bid ; +wire [1 :0] cpu_bresp ; +wire cpu_bvalid ; +wire cpu_bready ; + +//cpu axi wrap +wire cpu_wrap_aclk ; +wire cpu_wrap_aresetn; +wire [3 :0] cpu_wrap_arid ; +wire [31:0] cpu_wrap_araddr ; +wire [7 :0] cpu_wrap_arlen ; +wire [2 :0] cpu_wrap_arsize ; +wire [1 :0] cpu_wrap_arburst; +wire [1 :0] cpu_wrap_arlock ; +wire [3 :0] cpu_wrap_arcache; +wire [2 :0] cpu_wrap_arprot ; +wire cpu_wrap_arvalid; +wire cpu_wrap_arready; +wire [3 :0] cpu_wrap_rid ; +wire [31:0] cpu_wrap_rdata ; +wire [1 :0] cpu_wrap_rresp ; +wire cpu_wrap_rlast ; +wire cpu_wrap_rvalid ; +wire cpu_wrap_rready ; +wire [3 :0] cpu_wrap_awid ; +wire [31:0] cpu_wrap_awaddr ; +wire [7 :0] cpu_wrap_awlen ; +wire [2 :0] cpu_wrap_awsize ; +wire [1 :0] cpu_wrap_awburst; +wire [1 :0] cpu_wrap_awlock ; +wire [3 :0] cpu_wrap_awcache; +wire [2 :0] cpu_wrap_awprot ; +wire cpu_wrap_awvalid; +wire cpu_wrap_awready; +wire [3 :0] cpu_wrap_wid ; +wire [31:0] cpu_wrap_wdata ; +wire [3 :0] cpu_wrap_wstrb ; +wire cpu_wrap_wlast ; +wire cpu_wrap_wvalid ; +wire cpu_wrap_wready ; +wire [3 :0] cpu_wrap_bid ; +wire [1 :0] cpu_wrap_bresp ; +wire cpu_wrap_bvalid ; +wire cpu_wrap_bready ; +//axi ram +wire [3 :0] ram_arid ; +wire [31:0] ram_araddr ; +wire [3 :0] ram_arlen ; +wire [2 :0] ram_arsize ; +wire [1 :0] ram_arburst; +wire [1 :0] ram_arlock ; +wire [3 :0] ram_arcache; +wire [2 :0] ram_arprot ; +wire ram_arvalid; +wire ram_arready; +wire [3 :0] ram_rid ; +wire [31:0] ram_rdata ; +wire [1 :0] ram_rresp ; +wire ram_rlast ; +wire ram_rvalid ; +wire ram_rready ; +wire [3 :0] ram_awid ; +wire [31:0] ram_awaddr ; +wire [3 :0] ram_awlen ; +wire [2 :0] ram_awsize ; +wire [1 :0] ram_awburst; +wire [1 :0] ram_awlock ; +wire [3 :0] ram_awcache; +wire [2 :0] ram_awprot ; +wire ram_awvalid; +wire ram_awready; +wire [3 :0] ram_wid ; +wire [31:0] ram_wdata ; +wire [3 :0] ram_wstrb ; +wire ram_wlast ; +wire ram_wvalid ; +wire ram_wready ; +wire [3 :0] ram_bid ; +wire [1 :0] ram_bresp ; +wire ram_bvalid ; +wire ram_bready ; +//conf +wire [3 :0] conf_arid ; +wire [31:0] conf_araddr ; +wire [3 :0] conf_arlen ; +wire [2 :0] conf_arsize ; +wire [1 :0] conf_arburst; +wire [1 :0] conf_arlock ; +wire [3 :0] conf_arcache; +wire [2 :0] conf_arprot ; +wire conf_arvalid; +wire conf_arready; +wire [3 :0] conf_rid ; +wire [31:0] conf_rdata ; +wire [1 :0] conf_rresp ; +wire conf_rlast ; +wire conf_rvalid ; +wire conf_rready ; +wire [3 :0] conf_awid ; +wire [31:0] conf_awaddr ; +wire [3 :0] conf_awlen ; +wire [2 :0] conf_awsize ; +wire [1 :0] conf_awburst; +wire [1 :0] conf_awlock ; +wire [3 :0] conf_awcache; +wire [2 :0] conf_awprot ; +wire conf_awvalid; +wire conf_awready; +wire [3 :0] conf_wid ; +wire [31:0] conf_wdata ; +wire [3 :0] conf_wstrb ; +wire conf_wlast ; +wire conf_wvalid ; +wire conf_wready ; +wire [3 :0] conf_bid ; +wire [1 :0] conf_bresp ; +wire conf_bvalid ; +wire conf_bready ; + +//for lab6 +wire [4 :0] ram_random_mask; + +//cpu axi +//debug_* +mycpu_top u_cpu( + .aclk (cpu_clk ), + .aresetn (cpu_resetn ), //low active + + .arid (cpu_arid ), + .araddr (cpu_araddr ), + .arlen (cpu_arlen ), + .arsize (cpu_arsize ), + .arburst (cpu_arburst ), + .arlock (cpu_arlock ), + .arcache (cpu_arcache ), + .arprot (cpu_arprot ), + .arvalid (cpu_arvalid ), + .arready (cpu_arready ), + + .rid (cpu_rid ), + .rdata (cpu_rdata ), + .rresp (cpu_rresp ), + .rlast (cpu_rlast ), + .rvalid (cpu_rvalid ), + .rready (cpu_rready ), + + .awid (cpu_awid ), + .awaddr (cpu_awaddr ), + .awlen (cpu_awlen ), + .awsize (cpu_awsize ), + .awburst (cpu_awburst ), + .awlock (cpu_awlock ), + .awcache (cpu_awcache ), + .awprot (cpu_awprot ), + .awvalid (cpu_awvalid ), + .awready (cpu_awready ), + + .wid (cpu_wid ), + .wdata (cpu_wdata ), + .wstrb (cpu_wstrb ), + .wlast (cpu_wlast ), + .wvalid (cpu_wvalid ), + .wready (cpu_wready ), + + .bid (cpu_bid ), + .bresp (cpu_bresp ), + .bvalid (cpu_bvalid ), + .bready (cpu_bready ), + + //debug interface + .debug_wb_pc (debug_wb_pc ), + .debug_wb_rf_we (debug_wb_rf_we ), + .debug_wb_rf_wnum (debug_wb_rf_wnum ), + .debug_wb_rf_wdata(debug_wb_rf_wdata) +); +//cpu axi wrap +axi_wrap u_cpu_axi_wrap( + .m_aclk ( cpu_clk ), + .m_aresetn ( cpu_resetn ), + //ar + .m_arid ( cpu_arid ), + .m_araddr ( cpu_araddr ), + .m_arlen ( cpu_arlen ), + .m_arsize ( cpu_arsize ), + .m_arburst ( cpu_arburst ), + .m_arlock ( cpu_arlock ), + .m_arcache ( cpu_arcache ), + .m_arprot ( cpu_arprot ), + .m_arvalid ( cpu_arvalid ), + .m_arready ( cpu_arready ), + //r + .m_rid ( cpu_rid ), + .m_rdata ( cpu_rdata ), + .m_rresp ( cpu_rresp ), + .m_rlast ( cpu_rlast ), + .m_rvalid ( cpu_rvalid ), + .m_rready ( cpu_rready ), + //aw + .m_awid ( cpu_awid ), + .m_awaddr ( cpu_awaddr ), + .m_awlen ( cpu_awlen ), + .m_awsize ( cpu_awsize ), + .m_awburst ( cpu_awburst ), + .m_awlock ( cpu_awlock ), + .m_awcache ( cpu_awcache ), + .m_awprot ( cpu_awprot ), + .m_awvalid ( cpu_awvalid ), + .m_awready ( cpu_awready ), + //w + .m_wid ( cpu_wid ), + .m_wdata ( cpu_wdata ), + .m_wstrb ( cpu_wstrb ), + .m_wlast ( cpu_wlast ), + .m_wvalid ( cpu_wvalid ), + .m_wready ( cpu_wready ), + //b + .m_bid ( cpu_bid ), + .m_bresp ( cpu_bresp ), + .m_bvalid ( cpu_bvalid ), + .m_bready ( cpu_bready ), + + .s_aclk ( cpu_wrap_aclk ), + .s_aresetn ( cpu_wrap_aresetn ), + //ar + .s_arid ( cpu_wrap_arid ), + .s_araddr ( cpu_wrap_araddr ), + .s_arlen ( cpu_wrap_arlen ), + .s_arsize ( cpu_wrap_arsize ), + .s_arburst ( cpu_wrap_arburst ), + .s_arlock ( cpu_wrap_arlock ), + .s_arcache ( cpu_wrap_arcache ), + .s_arprot ( cpu_wrap_arprot ), + .s_arvalid ( cpu_wrap_arvalid ), + .s_arready ( cpu_wrap_arready ), + //r + .s_rid ( cpu_wrap_rid ), + .s_rdata ( cpu_wrap_rdata ), + .s_rresp ( cpu_wrap_rresp ), + .s_rlast ( cpu_wrap_rlast ), + .s_rvalid ( cpu_wrap_rvalid ), + .s_rready ( cpu_wrap_rready ), + //aw + .s_awid ( cpu_wrap_awid ), + .s_awaddr ( cpu_wrap_awaddr ), + .s_awlen ( cpu_wrap_awlen ), + .s_awsize ( cpu_wrap_awsize ), + .s_awburst ( cpu_wrap_awburst ), + .s_awlock ( cpu_wrap_awlock ), + .s_awcache ( cpu_wrap_awcache ), + .s_awprot ( cpu_wrap_awprot ), + .s_awvalid ( cpu_wrap_awvalid ), + .s_awready ( cpu_wrap_awready ), + //w + .s_wid ( cpu_wrap_wid ), + .s_wdata ( cpu_wrap_wdata ), + .s_wstrb ( cpu_wrap_wstrb ), + .s_wlast ( cpu_wrap_wlast ), + .s_wvalid ( cpu_wrap_wvalid ), + .s_wready ( cpu_wrap_wready ), + //b + .s_bid ( cpu_wrap_bid ), + .s_bresp ( cpu_wrap_bresp ), + .s_bvalid ( cpu_wrap_bvalid ), + .s_bready ( cpu_wrap_bready ) +); + +axi_crossbar_1x2 u_axi_crossbar_1x2( + .aclk ( cpu_wrap_aclk ), // i, 1 + .aresetn ( cpu_wrap_aresetn ), // i, 1 + + .s_axi_arid ( cpu_wrap_arid ), + .s_axi_araddr ( cpu_wrap_araddr ), + .s_axi_arlen ( cpu_wrap_arlen[3:0] ), + .s_axi_arsize ( cpu_wrap_arsize ), + .s_axi_arburst ( cpu_wrap_arburst ), + .s_axi_arlock ( cpu_wrap_arlock ), + .s_axi_arcache ( cpu_wrap_arcache ), + .s_axi_arprot ( cpu_wrap_arprot ), + .s_axi_arqos ( 4'd0 ), + .s_axi_arvalid ( cpu_wrap_arvalid ), + .s_axi_arready ( cpu_wrap_arready ), + .s_axi_rid ( cpu_wrap_rid ), + .s_axi_rdata ( cpu_wrap_rdata ), + .s_axi_rresp ( cpu_wrap_rresp ), + .s_axi_rlast ( cpu_wrap_rlast ), + .s_axi_rvalid ( cpu_wrap_rvalid ), + .s_axi_rready ( cpu_wrap_rready ), + .s_axi_awid ( cpu_wrap_awid ), + .s_axi_awaddr ( cpu_wrap_awaddr ), + .s_axi_awlen ( cpu_wrap_awlen[3:0] ), + .s_axi_awsize ( cpu_wrap_awsize ), + .s_axi_awburst ( cpu_wrap_awburst ), + .s_axi_awlock ( cpu_wrap_awlock ), + .s_axi_awcache ( cpu_wrap_awcache ), + .s_axi_awprot ( cpu_wrap_awprot ), + .s_axi_awqos ( 4'd0 ), + .s_axi_awvalid ( cpu_wrap_awvalid ), + .s_axi_awready ( cpu_wrap_awready ), + .s_axi_wid ( cpu_wrap_wid ), + .s_axi_wdata ( cpu_wrap_wdata ), + .s_axi_wstrb ( cpu_wrap_wstrb ), + .s_axi_wlast ( cpu_wrap_wlast ), + .s_axi_wvalid ( cpu_wrap_wvalid ), + .s_axi_wready ( cpu_wrap_wready ), + .s_axi_bid ( cpu_wrap_bid ), + .s_axi_bresp ( cpu_wrap_bresp ), + .s_axi_bvalid ( cpu_wrap_bvalid ), + .s_axi_bready ( cpu_wrap_bready ), + + .m_axi_arid ( {ram_arid ,conf_arid } ), + .m_axi_araddr ( {ram_araddr ,conf_araddr } ), + .m_axi_arlen ( {ram_arlen ,conf_arlen } ), + .m_axi_arsize ( {ram_arsize ,conf_arsize } ), + .m_axi_arburst ( {ram_arburst,conf_arburst} ), + .m_axi_arlock ( {ram_arlock ,conf_arlock } ), + .m_axi_arcache ( {ram_arcache,conf_arcache} ), + .m_axi_arprot ( {ram_arprot ,conf_arprot } ), + .m_axi_arqos ( ), + .m_axi_arvalid ( {ram_arvalid,conf_arvalid} ), + .m_axi_arready ( {ram_arready,conf_arready} ), + .m_axi_rid ( {ram_rid ,conf_rid } ), + .m_axi_rdata ( {ram_rdata ,conf_rdata } ), + .m_axi_rresp ( {ram_rresp ,conf_rresp } ), + .m_axi_rlast ( {ram_rlast ,conf_rlast } ), + .m_axi_rvalid ( {ram_rvalid ,conf_rvalid } ), + .m_axi_rready ( {ram_rready ,conf_rready } ), + .m_axi_awid ( {ram_awid ,conf_awid } ), + .m_axi_awaddr ( {ram_awaddr ,conf_awaddr } ), + .m_axi_awlen ( {ram_awlen ,conf_awlen } ), + .m_axi_awsize ( {ram_awsize ,conf_awsize } ), + .m_axi_awburst ( {ram_awburst,conf_awburst} ), + .m_axi_awlock ( {ram_awlock ,conf_awlock } ), + .m_axi_awcache ( {ram_awcache,conf_awcache} ), + .m_axi_awprot ( {ram_awprot ,conf_awprot } ), + .m_axi_awqos ( ), + .m_axi_awvalid ( {ram_awvalid,conf_awvalid} ), + .m_axi_awready ( {ram_awready,conf_awready} ), + .m_axi_wid ( {ram_wid ,conf_wid } ), + .m_axi_wdata ( {ram_wdata ,conf_wdata } ), + .m_axi_wstrb ( {ram_wstrb ,conf_wstrb } ), + .m_axi_wlast ( {ram_wlast ,conf_wlast } ), + .m_axi_wvalid ( {ram_wvalid ,conf_wvalid } ), + .m_axi_wready ( {ram_wready ,conf_wready } ), + .m_axi_bid ( {ram_bid ,conf_bid } ), + .m_axi_bresp ( {ram_bresp ,conf_bresp } ), + .m_axi_bvalid ( {ram_bvalid ,conf_bvalid } ), + .m_axi_bready ( {ram_bready ,conf_bready } ) + + ); + +//axi ram +axi_wrap_ram u_axi_ram +( + .aclk ( cpu_clk ), + .aresetn ( cpu_resetn ), + //ar + .axi_arid ( ram_arid ), + .axi_araddr ( ram_araddr ), + .axi_arlen ( {4'd0,ram_arlen} ), + .axi_arsize ( ram_arsize ), + .axi_arburst ( ram_arburst ), + .axi_arlock ( ram_arlock ), + .axi_arcache ( ram_arcache ), + .axi_arprot ( ram_arprot ), + .axi_arvalid ( ram_arvalid ), + .axi_arready ( ram_arready ), + //r + .axi_rid ( ram_rid ), + .axi_rdata ( ram_rdata ), + .axi_rresp ( ram_rresp ), + .axi_rlast ( ram_rlast ), + .axi_rvalid ( ram_rvalid ), + .axi_rready ( ram_rready ), + //aw + .axi_awid ( ram_awid ), + .axi_awaddr ( ram_awaddr ), + .axi_awlen ( {4'd0,ram_awlen[3:0]} ), + .axi_awsize ( ram_awsize ), + .axi_awburst ( ram_awburst ), + .axi_awlock ( ram_awlock ), + .axi_awcache ( ram_awcache ), + .axi_awprot ( ram_awprot ), + .axi_awvalid ( ram_awvalid ), + .axi_awready ( ram_awready ), + //w + .axi_wid ( ram_wid ), + .axi_wdata ( ram_wdata ), + .axi_wstrb ( ram_wstrb ), + .axi_wlast ( ram_wlast ), + .axi_wvalid ( ram_wvalid ), + .axi_wready ( ram_wready ), + //b ram + .axi_bid ( ram_bid ), + .axi_bresp ( ram_bresp ), + .axi_bvalid ( ram_bvalid ), + .axi_bready ( ram_bready ), + + //random mask + .ram_random_mask ( ram_random_mask ) +); + +//confreg +confreg #(.SIMULATION(SIMULATION)) u_confreg +( + .timer_clk ( timer_clk ), // i, 1 + .aclk ( cpu_clk ), // i, 1 + .aresetn ( cpu_resetn ), // i, 1 + + .arid (conf_arid ), + .araddr (conf_araddr ), + .arlen (conf_arlen ), + .arsize (conf_arsize ), + .arburst (conf_arburst ), + .arlock (conf_arlock ), + .arcache (conf_arcache ), + .arprot (conf_arprot ), + .arvalid (conf_arvalid ), + .arready (conf_arready ), + .rid (conf_rid ), + .rdata (conf_rdata ), + .rresp (conf_rresp ), + .rlast (conf_rlast ), + .rvalid (conf_rvalid ), + .rready (conf_rready ), + .awid (conf_awid ), + .awaddr (conf_awaddr ), + .awlen (conf_awlen ), + .awsize (conf_awsize ), + .awburst (conf_awburst ), + .awlock (conf_awlock ), + .awcache (conf_awcache ), + .awprot (conf_awprot ), + .awvalid (conf_awvalid ), + .awready (conf_awready ), + .wid (conf_wid ), + .wdata (conf_wdata ), + .wstrb (conf_wstrb ), + .wlast (conf_wlast ), + .wvalid (conf_wvalid ), + .wready (conf_wready ), + .bid (conf_bid ), + .bresp (conf_bresp ), + .bvalid (conf_bvalid ), + .bready (conf_bready ), + + .ram_random_mask ( ram_random_mask ), + .led ( led ), // o, 16 + .led_rg0 ( led_rg0 ), // o, 2 + .led_rg1 ( led_rg1 ), // o, 2 + .num_csn ( num_csn ), // o, 8 + .num_a_g ( num_a_g ), // o, 7 + .num_data ( num_data ), // o, 32 + .switch ( switch ), // i, 8 + .btn_key_col ( btn_key_col), // o, 4 + .btn_key_row ( btn_key_row), // i, 4 + .btn_step ( btn_step ) // i, 2 +); + +endmodule + diff --git a/lacpu/rtl/soc_lite_top.v.axi_bak b/lacpu/rtl/soc_lite_top.v.axi_bak new file mode 100644 index 0000000..5007fba --- /dev/null +++ b/lacpu/rtl/soc_lite_top.v.axi_bak @@ -0,0 +1,606 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +//************************************************************************* +// > File Name : soc_top.v +// > Description : SoC, included cpu, 2 x 3 bridge, +// inst ram, confreg, data ram +// +// ------------------------- +// | cpu | +// ------------------------- +// inst| | data +// | | +// | --------------------- +// | | 1 x 2 bridge | +// | --------------------- +// | | | +// | | | +// ------------- ----------- ----------- +// | inst ram | | data ram| | confreg | +// ------------- ----------- ----------- +// +// > Author : LOONGSON +// > Date : 2017-08-04 +//************************************************************************* + +`default_nettype none + +//for simulation: +//1. if define SIMU_USE_PLL = 1, will use clk_pll to generate cpu_clk/timer_clk, +// and simulation will be very slow. +//2. usually, please define SIMU_USE_PLL=0 to speed up simulation by assign +// cpu_clk/timer_clk = clk. +// at this time, cpu_clk/timer_clk frequency are both 100MHz, same as clk. +`define SIMU_USE_PLL 0 //set 0 to speed up simulation + +module soc_lite_top #(parameter SIMULATION=1'b0) +( + input wire resetn, + input wire clk, + + //------gpio------- + output wire [15:0] led, + output wire [1 :0] led_rg0, + output wire [1 :0] led_rg1, + output wire [7 :0] num_csn, + output wire [6 :0] num_a_g, + output wire [31:0] num_data, + input wire [7 :0] switch, + output wire [3 :0] btn_key_col, + input wire [3 :0] btn_key_row, + input wire [1 :0] btn_step +); +//debug signals +wire [31:0] debug_wb_pc; +wire [3 :0] debug_wb_rf_we; +wire [4 :0] debug_wb_rf_wnum; +wire [31:0] debug_wb_rf_wdata; + +//clk and resetn +wire cpu_clk; +wire timer_clk; +reg cpu_resetn; +always @(posedge cpu_clk) +begin + cpu_resetn <= resetn; +end +generate if(SIMULATION && `SIMU_USE_PLL==0) +begin: speedup_simulation + assign cpu_clk = clk; + assign timer_clk = clk; +end +else +begin: pll + clk_pll clk_pll + ( + .clk_in1 (clk), + .cpu_clk (cpu_clk), + .timer_clk (timer_clk) + ); +end +endgenerate + +//cpu axi +wire [3 :0] cpu_arid ; +wire [31:0] cpu_araddr ; +wire [7 :0] cpu_arlen ; +wire [2 :0] cpu_arsize ; +wire [1 :0] cpu_arburst; +wire [1 :0] cpu_arlock ; +wire [3 :0] cpu_arcache; +wire [2 :0] cpu_arprot ; +wire cpu_arvalid; +wire cpu_arready; +wire [3 :0] cpu_rid ; +wire [31:0] cpu_rdata ; +wire [1 :0] cpu_rresp ; +wire cpu_rlast ; +wire cpu_rvalid ; +wire cpu_rready ; +wire [3 :0] cpu_awid ; +wire [31:0] cpu_awaddr ; +wire [7 :0] cpu_awlen ; +wire [2 :0] cpu_awsize ; +wire [1 :0] cpu_awburst; +wire [1 :0] cpu_awlock ; +wire [3 :0] cpu_awcache; +wire [2 :0] cpu_awprot ; +wire cpu_awvalid; +wire cpu_awready; +wire [3 :0] cpu_wid ; +wire [31:0] cpu_wdata ; +wire [3 :0] cpu_wstrb ; +wire cpu_wlast ; +wire cpu_wvalid ; +wire cpu_wready ; +wire [3 :0] cpu_bid ; +wire [1 :0] cpu_bresp ; +wire cpu_bvalid ; +wire cpu_bready ; + +//cpu axi wrap +wire cpu_wrap_aclk ; +wire cpu_wrap_aresetn; +wire [3 :0] cpu_wrap_arid ; +wire [31:0] cpu_wrap_araddr ; +wire [7 :0] cpu_wrap_arlen ; +wire [2 :0] cpu_wrap_arsize ; +wire [1 :0] cpu_wrap_arburst; +wire [1 :0] cpu_wrap_arlock ; +wire [3 :0] cpu_wrap_arcache; +wire [2 :0] cpu_wrap_arprot ; +wire cpu_wrap_arvalid; +wire cpu_wrap_arready; +wire [3 :0] cpu_wrap_rid ; +wire [31:0] cpu_wrap_rdata ; +wire [1 :0] cpu_wrap_rresp ; +wire cpu_wrap_rlast ; +wire cpu_wrap_rvalid ; +wire cpu_wrap_rready ; +wire [3 :0] cpu_wrap_awid ; +wire [31:0] cpu_wrap_awaddr ; +wire [7 :0] cpu_wrap_awlen ; +wire [2 :0] cpu_wrap_awsize ; +wire [1 :0] cpu_wrap_awburst; +wire [1 :0] cpu_wrap_awlock ; +wire [3 :0] cpu_wrap_awcache; +wire [2 :0] cpu_wrap_awprot ; +wire cpu_wrap_awvalid; +wire cpu_wrap_awready; +wire [3 :0] cpu_wrap_wid ; +wire [31:0] cpu_wrap_wdata ; +wire [3 :0] cpu_wrap_wstrb ; +wire cpu_wrap_wlast ; +wire cpu_wrap_wvalid ; +wire cpu_wrap_wready ; +wire [3 :0] cpu_wrap_bid ; +wire [1 :0] cpu_wrap_bresp ; +wire cpu_wrap_bvalid ; +wire cpu_wrap_bready ; +//axi ram +wire [3 :0] ram_arid ; +wire [31:0] ram_araddr ; +wire [3 :0] ram_arlen ; +wire [2 :0] ram_arsize ; +wire [1 :0] ram_arburst; +wire [1 :0] ram_arlock ; +wire [3 :0] ram_arcache; +wire [2 :0] ram_arprot ; +wire ram_arvalid; +wire ram_arready; +wire [3 :0] ram_rid ; +wire [31:0] ram_rdata ; +wire [1 :0] ram_rresp ; +wire ram_rlast ; +wire ram_rvalid ; +wire ram_rready ; +wire [3 :0] ram_awid ; +wire [31:0] ram_awaddr ; +wire [3 :0] ram_awlen ; +wire [2 :0] ram_awsize ; +wire [1 :0] ram_awburst; +wire [1 :0] ram_awlock ; +wire [3 :0] ram_awcache; +wire [2 :0] ram_awprot ; +wire ram_awvalid; +wire ram_awready; +wire [3 :0] ram_wid ; +wire [31:0] ram_wdata ; +wire [3 :0] ram_wstrb ; +wire ram_wlast ; +wire ram_wvalid ; +wire ram_wready ; +wire [3 :0] ram_bid ; +wire [1 :0] ram_bresp ; +wire ram_bvalid ; +wire ram_bready ; +//conf +wire [3 :0] conf_arid ; +wire [31:0] conf_araddr ; +wire [3 :0] conf_arlen ; +wire [2 :0] conf_arsize ; +wire [1 :0] conf_arburst; +wire [1 :0] conf_arlock ; +wire [3 :0] conf_arcache; +wire [2 :0] conf_arprot ; +wire conf_arvalid; +wire conf_arready; +wire [3 :0] conf_rid ; +wire [31:0] conf_rdata ; +wire [1 :0] conf_rresp ; +wire conf_rlast ; +wire conf_rvalid ; +wire conf_rready ; +wire [3 :0] conf_awid ; +wire [31:0] conf_awaddr ; +wire [3 :0] conf_awlen ; +wire [2 :0] conf_awsize ; +wire [1 :0] conf_awburst; +wire [1 :0] conf_awlock ; +wire [3 :0] conf_awcache; +wire [2 :0] conf_awprot ; +wire conf_awvalid; +wire conf_awready; +wire [3 :0] conf_wid ; +wire [31:0] conf_wdata ; +wire [3 :0] conf_wstrb ; +wire conf_wlast ; +wire conf_wvalid ; +wire conf_wready ; +wire [3 :0] conf_bid ; +wire [1 :0] conf_bresp ; +wire conf_bvalid ; +wire conf_bready ; + +//for lab6 +wire [4 :0] ram_random_mask; + +//cpu axi +//debug_* +mycpu_top u_cpu( + .aclk (cpu_clk ), + .aresetn (cpu_resetn ), //low active + + .arid (cpu_arid ), + .araddr (cpu_araddr ), + .arlen (cpu_arlen ), + .arsize (cpu_arsize ), + .arburst (cpu_arburst ), + .arlock (cpu_arlock ), + .arcache (cpu_arcache ), + .arprot (cpu_arprot ), + .arvalid (cpu_arvalid ), + .arready (cpu_arready ), + + .rid (cpu_rid ), + .rdata (cpu_rdata ), + .rresp (cpu_rresp ), + .rlast (cpu_rlast ), + .rvalid (cpu_rvalid ), + .rready (cpu_rready ), + + .awid (cpu_awid ), + .awaddr (cpu_awaddr ), + .awlen (cpu_awlen ), + .awsize (cpu_awsize ), + .awburst (cpu_awburst ), + .awlock (cpu_awlock ), + .awcache (cpu_awcache ), + .awprot (cpu_awprot ), + .awvalid (cpu_awvalid ), + .awready (cpu_awready ), + + .wid (cpu_wid ), + .wdata (cpu_wdata ), + .wstrb (cpu_wstrb ), + .wlast (cpu_wlast ), + .wvalid (cpu_wvalid ), + .wready (cpu_wready ), + + .bid (cpu_bid ), + .bresp (cpu_bresp ), + .bvalid (cpu_bvalid ), + .bready (cpu_bready ), + + //debug interface + .debug_wb_pc (debug_wb_pc ), + .debug_wb_rf_we (debug_wb_rf_we ), + .debug_wb_rf_wnum (debug_wb_rf_wnum ), + .debug_wb_rf_wdata(debug_wb_rf_wdata) +); +//cpu axi wrap +axi_wrap u_cpu_axi_wrap( + .m_aclk ( cpu_clk ), + .m_aresetn ( cpu_resetn ), + //ar + .m_arid ( cpu_arid ), + .m_araddr ( cpu_araddr ), + .m_arlen ( cpu_arlen ), + .m_arsize ( cpu_arsize ), + .m_arburst ( cpu_arburst ), + .m_arlock ( cpu_arlock ), + .m_arcache ( cpu_arcache ), + .m_arprot ( cpu_arprot ), + .m_arvalid ( cpu_arvalid ), + .m_arready ( cpu_arready ), + //r + .m_rid ( cpu_rid ), + .m_rdata ( cpu_rdata ), + .m_rresp ( cpu_rresp ), + .m_rlast ( cpu_rlast ), + .m_rvalid ( cpu_rvalid ), + .m_rready ( cpu_rready ), + //aw + .m_awid ( cpu_awid ), + .m_awaddr ( cpu_awaddr ), + .m_awlen ( cpu_awlen ), + .m_awsize ( cpu_awsize ), + .m_awburst ( cpu_awburst ), + .m_awlock ( cpu_awlock ), + .m_awcache ( cpu_awcache ), + .m_awprot ( cpu_awprot ), + .m_awvalid ( cpu_awvalid ), + .m_awready ( cpu_awready ), + //w + .m_wid ( cpu_wid ), + .m_wdata ( cpu_wdata ), + .m_wstrb ( cpu_wstrb ), + .m_wlast ( cpu_wlast ), + .m_wvalid ( cpu_wvalid ), + .m_wready ( cpu_wready ), + //b + .m_bid ( cpu_bid ), + .m_bresp ( cpu_bresp ), + .m_bvalid ( cpu_bvalid ), + .m_bready ( cpu_bready ), + + .s_aclk ( cpu_wrap_aclk ), + .s_aresetn ( cpu_wrap_aresetn ), + //ar + .s_arid ( cpu_wrap_arid ), + .s_araddr ( cpu_wrap_araddr ), + .s_arlen ( cpu_wrap_arlen ), + .s_arsize ( cpu_wrap_arsize ), + .s_arburst ( cpu_wrap_arburst ), + .s_arlock ( cpu_wrap_arlock ), + .s_arcache ( cpu_wrap_arcache ), + .s_arprot ( cpu_wrap_arprot ), + .s_arvalid ( cpu_wrap_arvalid ), + .s_arready ( cpu_wrap_arready ), + //r + .s_rid ( cpu_wrap_rid ), + .s_rdata ( cpu_wrap_rdata ), + .s_rresp ( cpu_wrap_rresp ), + .s_rlast ( cpu_wrap_rlast ), + .s_rvalid ( cpu_wrap_rvalid ), + .s_rready ( cpu_wrap_rready ), + //aw + .s_awid ( cpu_wrap_awid ), + .s_awaddr ( cpu_wrap_awaddr ), + .s_awlen ( cpu_wrap_awlen ), + .s_awsize ( cpu_wrap_awsize ), + .s_awburst ( cpu_wrap_awburst ), + .s_awlock ( cpu_wrap_awlock ), + .s_awcache ( cpu_wrap_awcache ), + .s_awprot ( cpu_wrap_awprot ), + .s_awvalid ( cpu_wrap_awvalid ), + .s_awready ( cpu_wrap_awready ), + //w + .s_wid ( cpu_wrap_wid ), + .s_wdata ( cpu_wrap_wdata ), + .s_wstrb ( cpu_wrap_wstrb ), + .s_wlast ( cpu_wrap_wlast ), + .s_wvalid ( cpu_wrap_wvalid ), + .s_wready ( cpu_wrap_wready ), + //b + .s_bid ( cpu_wrap_bid ), + .s_bresp ( cpu_wrap_bresp ), + .s_bvalid ( cpu_wrap_bvalid ), + .s_bready ( cpu_wrap_bready ) +); + +axi_crossbar_1x2 u_axi_crossbar_1x2( + .aclk ( cpu_wrap_aclk ), // i, 1 + .aresetn ( cpu_wrap_aresetn ), // i, 1 + + .s_axi_arid ( cpu_wrap_arid ), + .s_axi_araddr ( cpu_wrap_araddr ), + .s_axi_arlen ( cpu_wrap_arlen[3:0] ), + .s_axi_arsize ( cpu_wrap_arsize ), + .s_axi_arburst ( cpu_wrap_arburst ), + .s_axi_arlock ( cpu_wrap_arlock ), + .s_axi_arcache ( cpu_wrap_arcache ), + .s_axi_arprot ( cpu_wrap_arprot ), + .s_axi_arqos ( 4'd0 ), + .s_axi_arvalid ( cpu_wrap_arvalid ), + .s_axi_arready ( cpu_wrap_arready ), + .s_axi_rid ( cpu_wrap_rid ), + .s_axi_rdata ( cpu_wrap_rdata ), + .s_axi_rresp ( cpu_wrap_rresp ), + .s_axi_rlast ( cpu_wrap_rlast ), + .s_axi_rvalid ( cpu_wrap_rvalid ), + .s_axi_rready ( cpu_wrap_rready ), + .s_axi_awid ( cpu_wrap_awid ), + .s_axi_awaddr ( cpu_wrap_awaddr ), + .s_axi_awlen ( cpu_wrap_awlen[3:0] ), + .s_axi_awsize ( cpu_wrap_awsize ), + .s_axi_awburst ( cpu_wrap_awburst ), + .s_axi_awlock ( cpu_wrap_awlock ), + .s_axi_awcache ( cpu_wrap_awcache ), + .s_axi_awprot ( cpu_wrap_awprot ), + .s_axi_awqos ( 4'd0 ), + .s_axi_awvalid ( cpu_wrap_awvalid ), + .s_axi_awready ( cpu_wrap_awready ), + .s_axi_wid ( cpu_wrap_wid ), + .s_axi_wdata ( cpu_wrap_wdata ), + .s_axi_wstrb ( cpu_wrap_wstrb ), + .s_axi_wlast ( cpu_wrap_wlast ), + .s_axi_wvalid ( cpu_wrap_wvalid ), + .s_axi_wready ( cpu_wrap_wready ), + .s_axi_bid ( cpu_wrap_bid ), + .s_axi_bresp ( cpu_wrap_bresp ), + .s_axi_bvalid ( cpu_wrap_bvalid ), + .s_axi_bready ( cpu_wrap_bready ), + + .m_axi_arid ( {ram_arid ,conf_arid } ), + .m_axi_araddr ( {ram_araddr ,conf_araddr } ), + .m_axi_arlen ( {ram_arlen ,conf_arlen } ), + .m_axi_arsize ( {ram_arsize ,conf_arsize } ), + .m_axi_arburst ( {ram_arburst,conf_arburst} ), + .m_axi_arlock ( {ram_arlock ,conf_arlock } ), + .m_axi_arcache ( {ram_arcache,conf_arcache} ), + .m_axi_arprot ( {ram_arprot ,conf_arprot } ), + .m_axi_arqos ( ), + .m_axi_arvalid ( {ram_arvalid,conf_arvalid} ), + .m_axi_arready ( {ram_arready,conf_arready} ), + .m_axi_rid ( {ram_rid ,conf_rid } ), + .m_axi_rdata ( {ram_rdata ,conf_rdata } ), + .m_axi_rresp ( {ram_rresp ,conf_rresp } ), + .m_axi_rlast ( {ram_rlast ,conf_rlast } ), + .m_axi_rvalid ( {ram_rvalid ,conf_rvalid } ), + .m_axi_rready ( {ram_rready ,conf_rready } ), + .m_axi_awid ( {ram_awid ,conf_awid } ), + .m_axi_awaddr ( {ram_awaddr ,conf_awaddr } ), + .m_axi_awlen ( {ram_awlen ,conf_awlen } ), + .m_axi_awsize ( {ram_awsize ,conf_awsize } ), + .m_axi_awburst ( {ram_awburst,conf_awburst} ), + .m_axi_awlock ( {ram_awlock ,conf_awlock } ), + .m_axi_awcache ( {ram_awcache,conf_awcache} ), + .m_axi_awprot ( {ram_awprot ,conf_awprot } ), + .m_axi_awqos ( ), + .m_axi_awvalid ( {ram_awvalid,conf_awvalid} ), + .m_axi_awready ( {ram_awready,conf_awready} ), + .m_axi_wid ( {ram_wid ,conf_wid } ), + .m_axi_wdata ( {ram_wdata ,conf_wdata } ), + .m_axi_wstrb ( {ram_wstrb ,conf_wstrb } ), + .m_axi_wlast ( {ram_wlast ,conf_wlast } ), + .m_axi_wvalid ( {ram_wvalid ,conf_wvalid } ), + .m_axi_wready ( {ram_wready ,conf_wready } ), + .m_axi_bid ( {ram_bid ,conf_bid } ), + .m_axi_bresp ( {ram_bresp ,conf_bresp } ), + .m_axi_bvalid ( {ram_bvalid ,conf_bvalid } ), + .m_axi_bready ( {ram_bready ,conf_bready } ) + + ); + +//axi ram +axi_wrap_ram u_axi_ram +( + .aclk ( cpu_clk ), + .aresetn ( cpu_resetn ), + //ar + .axi_arid ( ram_arid ), + .axi_araddr ( ram_araddr ), + .axi_arlen ( {4'd0,ram_arlen} ), + .axi_arsize ( ram_arsize ), + .axi_arburst ( ram_arburst ), + .axi_arlock ( ram_arlock ), + .axi_arcache ( ram_arcache ), + .axi_arprot ( ram_arprot ), + .axi_arvalid ( ram_arvalid ), + .axi_arready ( ram_arready ), + //r + .axi_rid ( ram_rid ), + .axi_rdata ( ram_rdata ), + .axi_rresp ( ram_rresp ), + .axi_rlast ( ram_rlast ), + .axi_rvalid ( ram_rvalid ), + .axi_rready ( ram_rready ), + //aw + .axi_awid ( ram_awid ), + .axi_awaddr ( ram_awaddr ), + .axi_awlen ( {4'd0,ram_awlen[3:0]} ), + .axi_awsize ( ram_awsize ), + .axi_awburst ( ram_awburst ), + .axi_awlock ( ram_awlock ), + .axi_awcache ( ram_awcache ), + .axi_awprot ( ram_awprot ), + .axi_awvalid ( ram_awvalid ), + .axi_awready ( ram_awready ), + //w + .axi_wid ( ram_wid ), + .axi_wdata ( ram_wdata ), + .axi_wstrb ( ram_wstrb ), + .axi_wlast ( ram_wlast ), + .axi_wvalid ( ram_wvalid ), + .axi_wready ( ram_wready ), + //b ram + .axi_bid ( ram_bid ), + .axi_bresp ( ram_bresp ), + .axi_bvalid ( ram_bvalid ), + .axi_bready ( ram_bready ), + + //random mask + .ram_random_mask ( ram_random_mask ) +); + +//confreg +confreg #(.SIMULATION(SIMULATION)) u_confreg +( + .timer_clk ( timer_clk ), // i, 1 + .aclk ( cpu_clk ), // i, 1 + .aresetn ( cpu_resetn ), // i, 1 + + .arid (conf_arid ), + .araddr (conf_araddr ), + .arlen (conf_arlen ), + .arsize (conf_arsize ), + .arburst (conf_arburst ), + .arlock (conf_arlock ), + .arcache (conf_arcache ), + .arprot (conf_arprot ), + .arvalid (conf_arvalid ), + .arready (conf_arready ), + .rid (conf_rid ), + .rdata (conf_rdata ), + .rresp (conf_rresp ), + .rlast (conf_rlast ), + .rvalid (conf_rvalid ), + .rready (conf_rready ), + .awid (conf_awid ), + .awaddr (conf_awaddr ), + .awlen (conf_awlen ), + .awsize (conf_awsize ), + .awburst (conf_awburst ), + .awlock (conf_awlock ), + .awcache (conf_awcache ), + .awprot (conf_awprot ), + .awvalid (conf_awvalid ), + .awready (conf_awready ), + .wid (conf_wid ), + .wdata (conf_wdata ), + .wstrb (conf_wstrb ), + .wlast (conf_wlast ), + .wvalid (conf_wvalid ), + .wready (conf_wready ), + .bid (conf_bid ), + .bresp (conf_bresp ), + .bvalid (conf_bvalid ), + .bready (conf_bready ), + + .ram_random_mask ( ram_random_mask ), + .led ( led ), // o, 16 + .led_rg0 ( led_rg0 ), // o, 2 + .led_rg1 ( led_rg1 ), // o, 2 + .num_csn ( num_csn ), // o, 8 + .num_a_g ( num_a_g ), // o, 7 + .num_data ( num_data ), // o, 32 + .switch ( switch ), // i, 8 + .btn_key_col ( btn_key_col), // o, 4 + .btn_key_row ( btn_key_row), // i, 4 + .btn_step ( btn_step ) // i, 2 +); + +endmodule + diff --git a/lacpu/rtl/soc_lite_top.v.bram_bak b/lacpu/rtl/soc_lite_top.v.bram_bak new file mode 100644 index 0000000..9483b94 --- /dev/null +++ b/lacpu/rtl/soc_lite_top.v.bram_bak @@ -0,0 +1,96 @@ +module soc_lite_top +( + input resetn, + input clk, + output [15:0] pc +); + //debug signals + wire [31:0] debug_wb_pc; + wire [3 :0] debug_wb_rf_wen; + wire [4 :0] debug_wb_rf_wnum; + wire [31:0] debug_wb_rf_wdata; + + //clk and resetn + wire cpu_clk; + reg cpu_resetn; + + assign pc = debug_wb_pc[15:0]; + //assign cpu_clk = clk; + always @(posedge cpu_clk) + begin + cpu_resetn <= resetn; + end + + pll pll( + .clk_in1(clk), + .clk_out1(cpu_clk) + ); + + + //cpu inst sram + wire cpu_inst_en; + wire [3 :0] cpu_inst_wen; + wire [31:0] cpu_inst_addr; + wire [31:0] cpu_inst_wdata; + wire [31:0] cpu_inst_rdata; + //cpu data sram + wire cpu_data_en; + wire [3 :0] cpu_data_wen; + wire [31:0] cpu_data_addr; + wire [31:0] cpu_data_wdata; + wire [31:0] cpu_data_rdata; + + //cpu + mycpu_top mycpu_top( + .clk (cpu_clk ), + .resetn (cpu_resetn), //low active + + .inst_sram_en (cpu_inst_en ), + .inst_sram_we (cpu_inst_wen ), + .inst_sram_addr (cpu_inst_addr ), + .inst_sram_wdata (cpu_inst_wdata), + .inst_sram_rdata (cpu_inst_rdata), + + .data_sram_en (cpu_data_en ), + .data_sram_we (cpu_data_wen ), + .data_sram_addr (cpu_data_addr ), + .data_sram_wdata (cpu_data_wdata), + .data_sram_rdata (cpu_data_rdata), + + //debug + .debug_wb_pc (debug_wb_pc ), + .debug_wb_rf_we (debug_wb_rf_wen ), + .debug_wb_rf_wnum (debug_wb_rf_wnum ), + .debug_wb_rf_wdata(debug_wb_rf_wdata) + ); + + + `ifdef DPIC + + + `else + //inst ram + inst_ram inst_ram + ( + .clka (cpu_clk ), + .ena (cpu_inst_en ), + .wea (cpu_inst_wen ), //3:0 + .addra (cpu_inst_addr[17:2]), //15:0 + .dina (cpu_inst_wdata ), //31:0 + .douta (cpu_inst_rdata ) //31:0 + ); + + //data ram + data_ram data_ram + ( + .clka (cpu_clk ), + .ena (cpu_data_en ), + .wea (cpu_data_wen ), //3:0 + .addra (cpu_data_addr[17:2]), //15:0 + .dina (cpu_data_wdata ), //31:0 + .douta (cpu_data_rdata ) //31:0 + ); + `endif + +endmodule + diff --git a/lacpu/rtl/xilinx_ip/data_ram/data_ram.xci b/lacpu/rtl/xilinx_ip/data_ram/data_ram.xci index 9a196b0..2d66520 100644 --- a/lacpu/rtl/xilinx_ip/data_ram/data_ram.xci +++ b/lacpu/rtl/xilinx_ip/data_ram/data_ram.xci @@ -131,9 +131,9 @@ 0 0 data_ram.mem - data_ram.mif + no_coe_file_loaded 0 - 1 + 0 0 0 1 @@ -172,7 +172,7 @@ false 8 NONE - data_ram.coe + no_coe_file_loaded ALL data_ram false @@ -189,7 +189,7 @@ Single_Bit_Error_Injection false Native - true + false no_mem_loaded Single_Port_RAM WRITE_FIRST @@ -239,8 +239,8 @@ artix7 - xc7a200t - fbg676 + xc7a100t + csg324 VERILOG MIXED diff --git a/lacpu/rtl/xilinx_ip/inst_ram/inst_ram.xci b/lacpu/rtl/xilinx_ip/inst_ram/inst_ram.xci index 0561af6..65be7cb 100644 --- a/lacpu/rtl/xilinx_ip/inst_ram/inst_ram.xci +++ b/lacpu/rtl/xilinx_ip/inst_ram/inst_ram.xci @@ -89,8 +89,8 @@ 0 0.000 0 - 18 - 18 + 16 + 16 1 4 0 @@ -98,7 +98,7 @@ 8 0 0 - 256 + 64 NONE 0 0 @@ -112,7 +112,7 @@ 0 0 0 - Estimated Power for IP : 10.194003 mW + Estimated Power for IP : 10.193999 mW artix7 0 1 @@ -131,14 +131,14 @@ 0 0 inst_ram.mem - inst_ram.mif + no_coe_file_loaded 0 - 1 + 0 0 0 1 - 262144 - 262144 + 65535 + 65535 1 1 32 @@ -157,8 +157,8 @@ 0 4 4 - 262144 - 262144 + 65535 + 65535 WRITE_FIRST WRITE_FIRST 32 @@ -172,7 +172,7 @@ false 8 NONE - inst_ram.coe + no_coe_file_loaded ALL inst_ram false @@ -189,7 +189,7 @@ Single_Bit_Error_Injection false Native - true + false no_mem_loaded Single_Port_RAM WRITE_FIRST @@ -228,7 +228,7 @@ false false false - 262144 + 65535 32 32 No_ECC @@ -239,8 +239,8 @@ artix7 - xc7a200t - fbg676 + xc7a100t + csg324 VERILOG MIXED diff --git a/lacpu/run_vivado/la32r/la32r.xpr b/lacpu/run_vivado/la32r/la32r.xpr index a7e329c..cb90eca 100644 --- a/lacpu/run_vivado/la32r/la32r.xpr +++ b/lacpu/run_vivado/la32r/la32r.xpr @@ -36,13 +36,13 @@