work/rtl/mem_mcu_wrap/mem_mcu_wrap详细设计文档.md

3.4 KiB
Raw Blame History

@TOC

1 mem_mcu_wrap top

在这里为了TOP集成的自动化和效率使用verilog-mode来集成主要是进行顶层集成工作

1.1 总体功能概述

mem_mcu_wrap模块是一个顶层模块主要负责将Corelink子模块和其他多master、多slave进行集成连接起来它的主要功能是如下所示

1.2 总体结构框图

该mem_mcu_wrap的总体结构框图如下所示: alt text 通过上述框架结构图,可以明确知道:

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 在这里原则上是要给出统一的slave寻址

1.3.4 生成switch示意图

在这里可以通过AMBA_de工具生成的switch示意图可以获得Corelink的详细连接关系 alt text 最后生成该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/)中进行使用

/* sub_block AUTO_TEMPLATE(
    .\(.*\)             (\1[]),
);
*/

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