verilog 支持定义数组参数,这样工程很大时,例化模块时可以使代码更简洁:详见实例
module dma_controller #(
parameter integer C0_MAX_MIG_BL[3:0] = {2048,2048,2048,2048}, parameter integer C0_APP_DATA_WIDTH[3:0] = {64,64,64,64} , parameter integer C0_DMA_WR_DATA_WIDTH[3:0] = {16,16,16,16} , parameter integer C0_DMA_RD_DATA_WIDTH[3:0] = {16,16,16,16} , parameter [1 : 8*11] C0_READ_WRITE[3:0] = {"Write Only","Bidirection","Bidirection","Bidirection"}, parameter integer C1_MAX_MIG_BL[3:0] = {2048,2048,2048,2048}, parameter integer C1_APP_DATA_WIDTH[3:0] = {128,128,128,128} , parameter integer C1_DMA_WR_DATA_WIDTH[3:0] = {32,32,32,32} , parameter integer C1_DMA_RD_DATA_WIDTH[3:0] = {32,32,32,32} , parameter [1 : 8*11] C1_READ_WRITE[3:0] = {"Write Only","Bidirection","Bidirection","Bidirection"} ) ( input main_clk ,//I,W:01,main_clk主系统时钟:200MHz input sys_rst ,。。。。。。
)
genvar gv_dma_i;
generate for (gv_dma_i=0;gv_dma_i<=3;gv_dma_i=gv_dma_i+1) begin : c0_dma_blk dma #( .MAX_MIG_BL (C0_MAX_MIG_BL[gv_dma_i]), .APP_DATA_WIDTH (C0_APP_DATA_WIDTH[gv_dma_i]), .DMA_WR_DATA_WIDTH(C0_DMA_WR_DATA_WIDTH[gv_dma_i]), .DMA_RD_DATA_WIDTH(C0_DMA_RD_DATA_WIDTH[gv_dma_i]), .READ_WRITE (C0_READ_WRITE[gv_dma_i]) //3 option : "Write Only" , "Read Only" , "Bidirection" ) inst_c0_dma( //与MIG(arbitor)接口 .ui_clk (c0_dma_ui_clk[gv_dma_i]),//I,W:01,UI接口输出时钟,200Mhz .ui_clk_sync_rst (c0_dma_ui_clk_sync_rst[gv_dma_i]),//I,W:01,同步时钟复位 .init_calib_complete(c0_dma_init_calib_complete[gv_dma_i]),//I,W:01,PHY校准完成,DMA可以在校准完成之前发送读写操作命令信息 .app_req (c0_dma_app_req[gv_dma_i]),//O,W:01,MIG UI接口使用请求 .app_resp (c0_mig2dma_app_resp[gv_dma_i]),//I,W:01,MIG UI接口使用应答 .app_done (c0_dma2mig_app_done[gv_dma_i]),//O,W:01,MIG UI接口使用结束,数据搬移完成 .app_addr (c0_dma2mig_app_addr[gv_dma_i]),//O,W:28or27,当前操作地址信息,第一个控制器地址位宽为28,第二个为27 .app_cmd (c0_dma2mig_app_cmd[gv_dma_i]),//O,W:03,操作命令 Read 001,Write 000 .app_en (c0_dma2mig_app_en[gv_dma_i]),//O,W:01,命令参数使能,UI接口在该信号有效时采集app_addr[]和app_cmd[2:0] .app_wdf_data (c0_dma2mig_app_wdf_data[gv_dma_i]),//O,W:APP_DATA_WIDTH,写数据端口,位宽视MIG controller而定,当连接controller1时,位宽为128bit,连接另一个controller时位宽为64bit .app_wdf_end (c0_dma2mig_app_wdf_end[gv_dma_i]),//O,W:01,指示当前时钟周期app_wdf_data总线上的数据为本次写请求的最后一个数据 .app_wdf_mask (c0_dma2mig_app_wdf_mask[gv_dma_i]),//O,W:APP_DATA_WIDTH/8,数据屏蔽位,位宽视MIG controller而定,当连接controller1时,位宽为16bit,连接另一个controller时位宽为8bit .app_wdf_wren (c0_dma2mig_app_wdf_wren[gv_dma_i]),//O,W:01,写使能,指示app_wdf_data总线上的数据有效 .app_rd_data (c0_mig2dma_app_rd_data[gv_dma_i]),//I,W:APP_DATA_WIDTH,读数据端口,位宽视MIG controller而定,当连接controller1时,位宽为128bit,连接另一个controller时位宽为64bit .app_rd_data_end (c0_mig2dma_app_rd_data_end[gv_dma_i]),//I,W:01,指示当前时钟周期app_rd_data总线上的数据为本次读请求的最后一个数据 .app_rd_data_valid (c0_mig2dma_app_rd_data_valid[gv_dma_i]),//I,W:01,读有效,指示app_rd_data总线上的数据有效 .app_rdy (c0_mig2dma_app_rdy[gv_dma_i]),//I,W:01,指示UI接口是否已经接收刚才发送的操作请求,当app_en有效后,如果UI接口没有使能app_rdy,表示刚才操作请求无效,需要从新发起读写请求 .app_wdf_rdy (c0_mig2dma_app_wdf_rdy[gv_dma_i]),//I,W:01,指示写FIFO准备好接受数据,数据在app_wdf_rdy 和 app_wdf_wren都有效时被写入FIFO
genvar gv_dma_j;
generate for (gv_dma_j=0;gv_dma_j<=2;gv_dma_j=gv_dma_j+1) begin : c1_dma_blk dma #( .MAX_MIG_BL (C1_MAX_MIG_BL[gv_dma_j]), .APP_DATA_WIDTH (C1_APP_DATA_WIDTH[gv_dma_j]), .DMA_WR_DATA_WIDTH(C1_DMA_WR_DATA_WIDTH[gv_dma_j]), .DMA_RD_DATA_WIDTH(C1_DMA_RD_DATA_WIDTH[gv_dma_j]), .READ_WRITE (C1_READ_WRITE[gv_dma_j]) //3 option : "Write Only" , "Read Only" , "Bidirection" ) inst_c1_dma( //与MIG(arbitor)接口 .ui_clk (c1_dma_ui_clk[gv_dma_j]),//I,W:01,UI接口输出时钟,200Mhz .ui_clk_sync_rst (c1_dma_ui_clk_sync_rst[gv_dma_j]),//I,W:01,同步时钟复位 .init_calib_complete(c1_dma_init_calib_complete[gv_dma_j]),//I,W:01,PHY校准完成,DMA可以在校准完成之前发送读写操作命令信息 .app_req (c1_dma_app_req[gv_dma_j]),//O,W:01,MIG UI接口使用请求 .app_resp (c1_mig2dma_app_resp[gv_dma_j]),//I,W:01,MIG UI接口使用应答 .app_done (c1_dma2mig_app_done[gv_dma_j]),//O,W:01,