
@[TOC](mem_mcu_wrap详细设计文档)

# 1 mem_mcu_wrap top
在这里为了TOP集成的自动化和效率，使用verilog-mode来集成；主要是进行顶层集成工作；
## 1.1 总体功能概述
`mem_mcu_wrap`模块是一个顶层模块，主要负责将Corelink子模块和其他多master、多slave进行集成连接起来，它的主要功能是如下所示：

## 1.2 总体结构框图
该mem_mcu_wrap的总体结构框图如下所示:
![alt text](企业微信截图_17510086982428.png)
通过上述框架结构图，可以明确知道：
### 1.2.1 master
master-0: Cortex-M3的I AHB总线
master-1: Cortex-M3的D AHB总线
master-2: Cortex-M3的S AHB总线
master-3: cfg_noc_cfg_axi
master-4: data_noc_cfg_axi

### 1.2.2 slave
slave-0: IMEM的AHB总线
slave-1: DMEM的AHB总线
slave-2: peri的apb总线
slave-3: apb的decoder总线

## 1.3 Corelink子模块
### 1.3.1 功能概述
该Corelink是由AMBA_de工具生成的nic400 switch模块，用以连接多master仲裁连接访问多slave;

### 1.3.2 路由关系
路由连接关系可以通过上述总体结构框图中获得；；在这里不在进行表述；；在图中主要获得：：master和slave、、总线协议、、配置时钟关系；；
### 1.3.3 地址分配
在这里对slave访问的地址优先是统一寻址，，即使不是在进行连接Corelink前进行map映射转换；；在这里也给出map的逻辑；；
![alt text](address.png)
在这里原则上是：：要给出统一的slave寻址；；

### 1.3.4 生成switch示意图
在这里可以通过AMBA_de工具生成的switch示意图，可以获得Corelink的详细连接关系；；
![alt text](image.png)
最后生成该RTL代码结构；；

## 1.4 Cortex-M3模块
在这里M3处理器是直接复用mcu_system里面的M3；；
Note:可能会遇到的问题是：：不知道输入的那些不明确含义的信号可能有什么问题，，在这里是参照mcu_system里面的默认赋值；；

## 1.5 peri_apb外设模块
在这里peri_apb外设模块是直接复用mcu_system里面的peri_apb，，只保留了timer,uart,mailbox和watchDog；；

## 1.6 IMEM和DMEM sram模块
在这里是使用cmsdk_ahb_sram标准模块，，来配置32KB的sram；；



# 2 mem_mcu_apb_deocder
在这里是按照图示的右边三个模块来进行生成；；apb_decoder的依据还是根据M3的访问地址而来；；
apb_decoder是参考top_apb_decoder来进行设计而来；；
apb_2to1是直接拿来用的；；
async2sync_apb_bridge是直接拿来用的；




# 3 Verilog-mode使用
## 3.1 变量范例使用
// Local Variables:
// verilog-library-flags:("-y ./")
// verilog-auto-inst-param-value:t
// verilog-auto-input-ignore-regexp:""
// verilog-auto-output-ignore-regexp:""
// End:

---------------------------------------->
// Local Variables:
// verilog-library-flags:("-y ./ -y ../common/basic -y ../common/cfg_noc -y ../common/crg -y cortexm3/cortexm3_integration/verilog -y ./nic400_ahb_matrix/nic400/verilog ")
// verilog-auto-inst-param-value:t
// verilog-auto-input-ignore-regexp:"mcu_intisr \\|mcu_core_obs_internalstate_\\|cfg_noc_engine._err_info_clear"
// verilog-auto-output-ignore-regexp:"mem_ctrl_bus_\\|cfg_die_crd_\\|_info_tmp\\|"
// End:

## 3.2 带参数例化使用
带参数的例化是在 (/*AUTOINST*/）中进行使用
```v
/* sub_block AUTO_TEMPLATE(
    .\(.*\)             (\1[]),
);
*/

sub_block #(
    .PARAM1(PARAM1_VALUE),
    .PARAM2(PARAM2_VALUE),
    .PARAM3(PARAM3_VALUE)
)  u_sub_block( /*AUTOINST*/);

```