Skip to content

Commit

Permalink
Merge branch 'chiplab'
Browse files Browse the repository at this point in the history
  • Loading branch information
eastonman committed May 21, 2022
2 parents e706691 + 136e5be commit cd42a88
Show file tree
Hide file tree
Showing 38 changed files with 2,054 additions and 1,670 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,9 @@ git checkout -b <branch_name>

`git pull`如果出现merge冲突,无需着急,执行`git reset --hard HEAD`将状态恢复到`git pull`之前,然后在群里大喊!


## Credit

> 引用和致谢
- [乘除法器](https://github.com/risclite/rv32m-multiplier-and-divider)
119 changes: 83 additions & 36 deletions src/vsrc/AXI/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@

## 目录结构
```
AXI/ # 本目录
axi_master # axi主机接口,接入cpu_top
axi_defines.v # 定义了宏的文件
AXI
AXI_Master/ 主机接口文件夹
axi_Master axi主机接口,接入cpu_top
axi_MasterThree 失败版本,不用管
AXI_Slave/ 空文件夹
axi_defines.v 定义了宏的文件
```

## 接口说明
Expand All @@ -13,19 +18,40 @@
input wire aclk,
input wire aresetn, //low is valid
来自cpu和输出到cpu的信号,其中只有cpu_data_o和stallreq是输出的。
//CPU
input wire [`ADDR]cpu_addr_i,
input wire cpu_ce_i,
input wire [`Data]cpu_data_i,
input wire cpu_we_i ,
input wire [3:0]cpu_sel_i,
input wire stall_i,
input wire flush_i,
output reg [`Data]cpu_data_o,//指令
output wire stallreq,//暂停信号
input wire [3:0]id,//决定是读数据还是取指令
来自cpu和输出到cpu的信号,其中只有inst_cpu_data_o,data_cpu_data_o和inst_stallreq,data_stallreq是输出的。
//icache/IF
input wire [`ADDR]inst_cpu_addr_i,
input wire inst_cpu_ce_i,
input wire [`Data]inst_cpu_data_i,
input wire inst_cpu_we_i ,
input wire [3:0]inst_cpu_sel_i,
input wire inst_stall_i,
input wire inst_flush_i,
output reg [`Data]inst_cpu_data_o,
output wire inst_stallreq,
input wire [3:0]inst_id,//决定是读数据还是取指令,默认4’b0000
//icache 读请求的类型,3’b100表示一次性读取1个cache行(一个cache行默认4*32bit的数据,inst[addr],inst[addr+4],inst[addr+8],inst[addr+12]);其他值表示一次读取1*32bit数据
input wire [2:0]icache_rd_type_i,
//dcache/MEM
input wire [`ADDR]data_cpu_addr_i,
input wire data_cpu_ce_i,
input wire [`Data]data_cpu_data_i,
input wire data_cpu_we_i ,
input wire [3:0]data_cpu_sel_i,
input wire data_stall_i,
input wire data_flush_i,
output reg [`Data]data_cpu_data_o,
output wire data_stallreq,
input wire [3:0]data_id,//决定是读数据还是取指令,默认4'b0001
// 同icache_rd_type_i
input wire [2:0]dcache_rd_type_i,
//表示一次性写入的数据,3'b100表示把一个cache行写入连续的4*32bit空间,Mem[addr]=dcache_wr_data[31:0],...Mem[addr+12]=dcache_wr_data[127:96];其他数值表示只写入dcache[31:0]
input wire [2:0]dcache_wr_type_i,//decache write type
//4*32bit的写入数据,如果只想写一个数据,只需要保证31:0是正确的写入数据即可
input wire [`BurstData]dcache_wr_data,//data from dcache
AXI标准信号接口,输出到从机或从从机输入,无需关心内部逻辑,照着接线就好,s是前缀。
//Slave
Expand Down Expand Up @@ -79,31 +105,50 @@

## 使用说明
1. 把axi_Master主机接口放到cpuTop中实例化
* 仅验证读功能的axi接口,取值id接口`4’b0000`,取数id接口`4'b0001`
* 实现仲裁的axi接口(不支持同种请求的连续发送和突发传输,支持同时送取指和取数),取值id接口`4’b0000`,取数id接口`4'b0001`
* 支持写操作,读指令和读数据。若同时发出取指和取数,会并行执行(指同时发送两种请求,若先取指后取数或先取数后取指都无法并行)
* 如果连续发送两次读请求,则会等待第一个读请求结束在处理第二个读请求
* 先写后读,写请求结束后才会处理读请求
* 所有的请求在请求结束前,都需要保证来自cpu的输入信号不变
* dcache/icache_rd/wr_type_i表示一次性读或写的数据量。`3'b100`表示一次性读/写连续四个地址的数据;其他值表示只读/写一个数据,推荐直接写0
* 即使没有cache。icache和dcache开头的信号都要接
* 下面的说明,不适用突发传输,icache/dcache_rd/wr_type_i照着抄就好,不需要改。需要注意的是dcache_wr_data需要是128bit的数据,如果只想写一个的话,需要再前面添加96个0,例如写data[31:0],则dcache_wr_data({{96{1'b0}}},data[31:0])
```
//AXI Master interface for fetch instruction channel
wire aresetn=~rst;
wire axi_stall=&stall;
wire stallreq_from_if;
wire stallreq_from_mem;
wire [31:0]inst_data_from_axi;
wire [31:0]mem_data_from_axi;
wire [31:0]data;//写入的数据
//接口实例化
axi_Master inst_interface(
.aclk(clk),
.aresetn(aresetn), //low is valid
//CPU
.cpu_addr_i(pc),
.cpu_ce_i(chip_enable),
.cpu_data_i(0),
.cpu_we_i(0) ,
.cpu_sel_i(4'b1111),
.stall_i(axi_stall),
.flush_i(0),
.cpu_data_o(inst_data_from_axi),
.stallreq(stallreq_from_if),
.id(4'b0000),//决定是读数据还是取指令
//icache/IF
.inst_cpu_addr_i(inst_pc),
.inst_cpu_ce_i(inst_chip_enable),
.inst_cpu_we_i(0) ,
.inst_cpu_sel_i(4'b1111),
.inst_flush_i(0),
.inst_cpu_data_o(inst_data_from_axi),
.inst_stallreq(stallreq_from_if),
.inst_id(4'b0000),//决定是读数据还是取指令
.icache_rd_type_i(0),//3'b100开启连续读4个数据;0只读一个数据
//dacache/MEM
.data_cpu_addr_i(data_pc),
.data_cpu_ce_i(data_chip_enable),
.data_cpu_we_i(data_we) ,
.data_cpu_sel_i(4'b1111),
.data_flush_i(0),
.data_cpu_data_o(mem_data_from_axi),
.data_stallreq(stallreq_from_mem),
.data_id(4'b0001),//决定是读数据还是取指令
.dcache_rd_type_i(0),//同icache
.dcache_wr_type_i(0),//写的数据量,3'b100表示连续写四个数据至相邻的地址;0表示只写一个数据
.dcache_wr_data({{96{1'b0}},data[31:0]}),//128bit的写入数据,如果只想写一个那么只需要保证31:0正确
//ar
.s_arid(i_arid), //arbitration
.s_araddr(i_araddr),
Expand Down Expand Up @@ -139,7 +184,7 @@
//w
.s_wid(i_wid),
.s_wdata(i_wdata),
.s_wstrb(i_wstrb),//字节选通位和sel差不多
.s_wstrb(i_wstrb),//字节选通位和sel差不多,写32字节用4'b1111
.s_wlast(i_wlast),
.s_wvalid(i_wvalid),
.s_wready(i_wready),
Expand All @@ -154,6 +199,8 @@
```


2. inst_data_from_axi为从ram中取到的数据,建议直接放到if_buffer中,以实现pc和inst的对齐。stallreq_if为暂停请求,连接到CTRL中。ctrl和if_buffer的暂停逻辑重写。详情看具体的文件。
* [ctrl文件](../vsrc/ctrl.v)
* [if_buffer](../vsrc/if_buffer.v)
2. inst_data_from_axi,mem_data_from为从ram中取到的数据

3. xxx_cpu_sel_i为字节选通使能,用来实现store类型。

4. stallreq_if和stallreq_mem为暂停请求,因为AXI直接面向CPU,所以,在AXI进行读写数据时,CPU必须暂停,等到AXI完成读写数据的操作。
6 changes: 4 additions & 2 deletions src/vsrc/AXI/axi_defines.sv
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
`define Prot 2:0
`define Data 31:0
`define Resp 1:0
`define BurstData 127:0


//stall state
`define STALL 4'b1111 //哈佛结构增加的暂停缓存状态,用于处理暂停信号
`define STALL 4'b1111 //哈佛结构增加的暂停缓存状态,用于处理暂停信号

//Master read state
`define R_FREE 4'b0000
Expand All @@ -27,4 +29,4 @@
//burst
`define FIXED 2'b00
`define INCR 2'b01
`define WRAP 2'b10
`define WRAP 2'b10
Loading

0 comments on commit cd42a88

Please sign in to comment.