3.4 KiB
@TOC
1 mem_mcu_wrap top
在这里为了TOP集成的自动化和效率,使用verilog-mode来集成;主要是进行顶层集成工作;
1.1 总体功能概述
mem_mcu_wrap
模块是一个顶层模块,主要负责将Corelink子模块和其他多master、多slave进行集成连接起来,它的主要功能是如下所示:
1.2 总体结构框图
该mem_mcu_wrap的总体结构框图如下所示:
通过上述框架结构图,可以明确知道:
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的逻辑;;
在这里原则上是::要给出统一的slave寻址;;
1.3.4 生成switch示意图
在这里可以通过AMBA_de工具生成的switch示意图,可以获得Corelink的详细连接关系;;
最后生成该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*/);