{"id":1430,"date":"2026-05-08T22:39:06","date_gmt":"2026-05-08T14:39:06","guid":{"rendered":"http:\/\/www.hanhhsir.cn\/?p=1430"},"modified":"2026-05-08T22:39:59","modified_gmt":"2026-05-08T14:39:59","slug":"%e5%9f%ba%e4%ba%8eahb%e7%9a%84%e5%9b%9b%e9%80%9a%e9%81%93dma%e6%8e%a7%e5%88%b6%e5%99%a8%e8%ae%be%e8%ae%a1-test_dma-v","status":"publish","type":"post","link":"http:\/\/www.hanhhsir.cn\/index.php\/2026\/05\/08\/%e5%9f%ba%e4%ba%8eahb%e7%9a%84%e5%9b%9b%e9%80%9a%e9%81%93dma%e6%8e%a7%e5%88%b6%e5%99%a8%e8%ae%be%e8%ae%a1-test_dma-v\/","title":{"rendered":"\u57fa\u4e8eAHB\u7684\u56db\u901a\u9053DMA\u63a7\u5236\u5668\u8bbe\u8ba1-test_dma.v"},"content":{"rendered":"<p><strong>test_dma.v = DMA \u63a7\u5236\u5668\u7684\u4eff\u771f\u6d4b\u8bd5\u5e73\u53f0<\/strong><br \/>\n<strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u4f8b\u5316\u4f60\u524d\u9762\u7684 dmac \u9876\u5c42<\/strong><br \/>\n<strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u7528 sim_ahb_task \u6a21\u62df CPU \u914d\u7f6e DMA<\/strong><br \/>\n<strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u6a21\u62df \u5916\u8bbe\u89e6\u53d1 DMA \u8bf7\u6c42<\/strong><br \/>\n<strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u81ea\u52a8\u8dd1\u6d4b\u8bd5\u7528\u4f8b\uff0c\u770b DMA \u642c\u6570\u636e\u5bf9\u4e0d\u5bf9<\/strong><\/p>\n<p>`timescale 1ns\/10ps<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u6a21\u5757\uff1aDMA \u4eff\u771f\u6d4b\u8bd5\u9876\u5c42<\/strong><br \/>\n<strong>\/\/ \u4f5c\u7528\uff1a\u7ed9DMA\u4f9b\u7535\u3001\u6a21\u62dfCPU\u3001\u6a21\u62df\u5916\u8bbe\u3001\u8dd1\u6d4b\u8bd5\u7528\u4f8b<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nmodule test_dma;<\/p>\n<p>\/\/ \u65f6\u949f\u5468\u671f\uff1a100ns \u2192 10MHz<br \/>\nparameter PERIOD = 100;<\/p>\n<p>\/\/ DMA \u5bc4\u5b58\u5668\u57fa\u5730\u5740\uff08\u548c dmac_intf \u4e00\u81f4\uff09<br \/>\nparameter BASE_ADDR= 32&#8217;h4000_0000;<\/p>\n<p>\/\/ \u901a\u9053\u4f7f\u80fd<br \/>\nparameter CH0_EN = 1;<br \/>\nparameter CH1_EN = 1;<br \/>\nparameter CH2_EN = 1;<br \/>\nparameter CH3_EN = 1;<\/p>\n<p>\/\/ \u901a\u9053\u65b9\u5411\u914d\u7f6e<br \/>\nparameter CH0_TGT = 32&#8217;h10;<br \/>\nparameter CH1_TGT = 32&#8217;h10;<br \/>\nparameter CH2_TGT = 32&#8217;h10;<br \/>\nparameter CH3_TGT = 32&#8217;h10;<\/p>\n<p>\/\/ ==============================<br \/>\n\/\/ DMA \u5bc4\u5b58\u5668\u5730\u5740\u6620\u5c04\uff08\u548c dmac_intf \u5b8c\u5168\u5bf9\u5e94\uff09<br \/>\n\/\/ ==============================<br \/>\nparameter CH0_CTRL = BASE_ADDR + 32&#8217;h0; \/\/ \u901a\u90530\u63a7\u5236<br \/>\nparameter CH1_CTRL = BASE_ADDR + 32&#8217;h12;<br \/>\nparameter CH2_CTRL = BASE_ADDR + 32&#8217;h24;<br \/>\nparameter CH3_CTRL = BASE_ADDR + 32&#8217;h36;<\/p>\n<p>parameter CH0_SOUR = BASE_ADDR + 32&#8217;h4; \/\/ \u901a\u90530\u6e90\u5730\u5740<br \/>\nparameter CH1_SOUR = BASE_ADDR + 32&#8217;h16;<br \/>\nparameter CH2_SOUR = BASE_ADDR + 32&#8217;h28;<br \/>\nparameter CH3_SOUR = BASE_ADDR + 32&#8217;h40;<\/p>\n<p>parameter CH0_DEST = BASE_ADDR + 32&#8217;h8; \/\/ \u901a\u90530\u76ee\u6807\u5730\u5740<br \/>\nparameter CH1_DEST = BASE_ADDR + 32&#8217;h20;<br \/>\nparameter CH2_DEST = BASE_ADDR + 32&#8217;h32;<br \/>\nparameter CH3_DEST = BASE_ADDR + 32&#8217;h44;<\/p>\n<p>\/\/ \u6d4b\u8bd5\u7528\u4f8b\u7f16\u53f7<br \/>\ninteger testcase;<\/p>\n<p>\/\/ \u8ba1\u6570\u5668<br \/>\nreg [7:0] cnt;<\/p>\n<p>\/\/ \u65f6\u949f\u3001\u590d\u4f4d<br \/>\nreg hreset_n, hclk;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ AHB \u4e3b\u673a\u4fe1\u53f7\uff08\u6a21\u62df CPU\uff09<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nreg cpu_s_hsel; \/\/ \u7247\u9009<br \/>\nreg [31:0] cpu_s_haddr; \/\/ \u5730\u5740<br \/>\nreg [31:0] cpu_s_hwdata; \/\/ \u5199\u6570\u636e<br \/>\nreg cpu_s_hwrite; \/\/ \u8bfb\u5199<br \/>\nreg [1:0] cpu_s_htrans; \/\/ \u4f20\u8f93\u7c7b\u578b<br \/>\nreg [2:0] cpu_s_hburst; \/\/ \u7a81\u53d1\u7c7b\u578b<br \/>\nreg [2:0] cpu_s_hsize; \/\/ \u4f4d\u5bbd<br \/>\nreg [3:0] cpu_s_hprot; \/\/ \u4fdd\u62a4<br \/>\nreg cpu_s_hlock; \/\/ \u9501\u5b9a<br \/>\nreg cpu_s_hbusreq; \/\/ \u603b\u7ebf\u8bf7\u6c42<\/p>\n<p>\/\/ AHB \u8bfb\u6570\u636e\u3001DMA \u5c31\u7eea\u4fe1\u53f7<br \/>\nwire [31:0] hrdata;<br \/>\nwire hreadyout_from_dmaslv;<\/p>\n<p>\/\/ \u4e34\u65f6\u5bc4\u5b58\u5668<br \/>\nreg [31:0] xfr_reg;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u5916\u8bbe DMA \u8bf7\u6c42\u89e6\u53d1\u4fe1\u53f7\uff08Testbench \u5185\u90e8\u7528\uff09<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nreg req_0_trig;<br \/>\nreg req_1_trig;<br \/>\nreg req_2_trig;<br \/>\nreg req_3_trig;<\/p>\n<p>\/\/ \u53d1\u7ed9 DMA \u7684\u5916\u8bbe\u8bf7\u6c42\u4fe1\u53f7\uff08peri_req = \u5916\u8bbe\u8bf7\u6c42DMA\uff09<br \/>\nreg peri_req_0;<br \/>\nreg peri_req_1;<br \/>\nreg peri_req_2;<br \/>\nreg peri_req_3;<\/p>\n<p>\/\/ DMA \u5e94\u7b54\u4fe1\u53f7\uff08DMA \u7ed9\u5916\u8bbe\u7684\u5e94\u7b54\uff09<br \/>\nwire dmac_ack_0;<br \/>\nwire dmac_ack_1;<br \/>\nwire dmac_ack_2;<br \/>\nwire dmac_ack_3;<\/p>\n<p>\/\/ \u6d4b\u8bd5\u7528\u901a\u9053\u4f7f\u80fd\/\u65b9\u5411<br \/>\nreg tb_ch_en_0;<br \/>\nreg tb_ch_en_1;<br \/>\nreg tb_ch_en_2;<br \/>\nreg tb_ch_en_3;<\/p>\n<p>reg tb_ch_tgt_0;<br \/>\nreg tb_ch_tgt_1;<br \/>\nreg tb_ch_tgt_2;<br \/>\nreg tb_ch_tgt_3;<\/p>\n<p>\/\/ \u6a21\u62df\u5916\u8bbe\u7ed9DMA\u7684\u6570\u636e<br \/>\nreg [31:0] tb_hrdatain;<br \/>\nreg [31:0] tb_ch_datain_0;<br \/>\nreg [31:0] tb_ch_datain_1;<br \/>\nreg [31:0] tb_ch_datain_2;<br \/>\nreg [31:0] tb_ch_datain_3;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u5305\u542b AHB \u4eff\u771f\u4efb\u52a1\uff08\u5199\u3001\u8bfb\u3001\u7a7a\u95f2\uff09<\/strong><br \/>\n<strong>\/\/ \u5c31\u662f\u4f60\u4e0a\u4e00\u4e2a\u6587\u4ef6 sim_ahb_task.v<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\n`include &#8220;sim_ahb_task.v&#8221;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u4f8b\u5316 DMA \u9876\u5c42\uff08\u88ab\u6d4b\u8bd5\u7684\u6a21\u5757\uff09<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\ndmac u_dmac(<br \/>\n.HCLK (hclk),<br \/>\n.HRESETn (hreset_n),<\/p>\n<p>\/\/ AHB \u4ece\u673a\uff1aCPU \u914d\u7f6e\u63a5\u53e3<br \/>\n.HSEL_SLV (cpu_s_hsel),<br \/>\n.HREADYIN_SLV (1&#8217;b1),<br \/>\n.HTRANS_SLV (cpu_s_htrans),<br \/>\n.HSIZE_SLV (cpu_s_hsize),<br \/>\n.HWRITE_SLV (cpu_s_hwrite),<br \/>\n.HADDR_SLV (cpu_s_haddr),<br \/>\n.HWDATA_SLV (cpu_s_hwdata),<br \/>\n.HREADYOUT_SLV (hreadyout_from_dmaslv),<br \/>\n.HRESP_SLV (),<br \/>\n.HRDATA_SLV (hrdata),<\/p>\n<p>\/\/ AHB \u4e3b\u673a\uff1aDMA \u8bbf\u95ee\u603b\u7ebf\uff08\u4eff\u771f\u4e2d\u60ac\u7a7a\u4e0d\u63a5\uff09<br \/>\n.HSEL (),<br \/>\n.HTRANS (),<br \/>\n.HSIZE (),<br \/>\n.HWRITE (),<br \/>\n.HADDR (),<br \/>\n.HWDATA (),<br \/>\n.HREADY_IN (1&#8217;b1), \/\/ \u6a21\u62df\u4ece\u673a\u6c38\u8fdc\u5c31\u7eea<br \/>\n.HRESP (),<br \/>\n.HRDATA (tb_hrdatain), \/\/ \u6a21\u62df\u5916\u8bbe\u7ed9DMA\u7684\u6570\u636e<\/p>\n<p>\/\/ \u5916\u8bbe\u8bf7\u6c42 &amp; DMA \u5e94\u7b54<br \/>\n.req_0 (peri_req_0),<br \/>\n.req_1 (peri_req_1),<br \/>\n.req_2 (peri_req_2),<br \/>\n.req_3 (peri_req_3),<br \/>\n.ack_0 (dmac_ack_0),<br \/>\n.ack_1 (dmac_ack_1),<br \/>\n.ack_2 (dmac_ack_2),<br \/>\n.ack_3 (dmac_ack_3)<br \/>\n);<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u5916\u8bbe\u8bf7\u6c42\u751f\u6210\u903b\u8f91\uff1atrig \u89e6\u53d1 \u2192 \u4ea7\u751f peri_req \u2192 \u6536\u5230 ack \u6e05\u9664<\/strong><br \/>\n<strong>\/\/ \u4f5c\u7528\uff1a\u6a21\u62df\u5916\u8bbe\u201c\u6211\u9700\u8981DMA\u670d\u52a1\u201d<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) peri_req_0 &lt;= 0;<br \/>\nelse if (req_0_trig)peri_req_0 &lt;= 1;<br \/>\nelse if (dmac_ack_0)peri_req_0 &lt;= 0;<\/p>\n<p>always @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) peri_req_1 &lt;= 0;<br \/>\nelse if (req_1_trig)peri_req_1 &lt;= 1;<br \/>\nelse if (dmac_ack_1)peri_req_1 &lt;= 0;<\/p>\n<p>always @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) peri_req_2 &lt;= 0;<br \/>\nelse if (req_2_trig)peri_req_2 &lt;= 1;<br \/>\nelse if (dmac_ack_2)peri_req_2 &lt;= 0;<\/p>\n<p>always @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) peri_req_3 &lt;= 0;<br \/>\nelse if (req_3_trig)peri_req_3 &lt;= 1;<br \/>\nelse if (dmac_ack_3)peri_req_3 &lt;= 0;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u6a21\u62df\u5916\u8bbe\u53d1\u9001\u81ea\u589e\u6570\u636e\uff08\u6bcf\u89e6\u53d1\u4e00\u6b21+1\uff09<\/strong><br \/>\n<strong>\/\/ \u4f5c\u7528\uff1a\u8ba9DMA\u642c\u7684\u6570\u636e\u6709\u89c4\u5f8b\uff0c\u65b9\u4fbf\u770b\u5bf9\u4e0d\u5bf9<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) tb_ch_datain_0 &lt;= 0;<br \/>\nelse if (~tb_ch_en_0)tb_ch_datain_0 &lt;= 0;<br \/>\nelse if (req_0_trig)tb_ch_datain_0 &lt;= tb_ch_datain_0 + 1;<\/p>\n<p>always @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) tb_ch_datain_1 &lt;= 0;<br \/>\nelse if (~tb_ch_en_1)tb_ch_datain_1 &lt;= 0;<br \/>\nelse if (req_0_trig)tb_ch_datain_1 &lt;= tb_ch_datain_1 + 1;<\/p>\n<p>always @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) tb_ch_datain_2 &lt;= 0;<br \/>\nelse if (~tb_ch_en_2)tb_ch_datain_2 &lt;= 0;<br \/>\nelse if (req_0_trig)tb_ch_datain_2 &lt;= tb_ch_datain_2 + 1;<\/p>\n<p>always @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) tb_ch_datain_3 &lt;= 0;<br \/>\nelse if (~tb_ch_en_3)tb_ch_datain_3 &lt;= 0;<br \/>\nelse if (req_0_trig)tb_ch_datain_3 &lt;= tb_ch_datain_3 + 1;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u6839\u636e\u5f53\u524d\u54ea\u4e2a\u5916\u8bbe\u8bf7\u6c42\uff0c\u628a\u5bf9\u5e94\u6570\u636e\u9001\u7ed9DMA\u7684HRDATA<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge hclk or negedge hreset_n)<br \/>\nif (!hreset_n) tb_hrdatain &lt;= 1;<br \/>\nelse if (peri_req_0) tb_hrdatain &lt;= tb_ch_datain_0;<br \/>\nelse if (peri_req_1) tb_hrdatain &lt;= tb_ch_datain_1;<br \/>\nelse if (peri_req_2) tb_hrdatain &lt;= tb_ch_datain_2;<br \/>\nelse if (peri_req_3) tb_hrdatain &lt;= tb_ch_datain_3;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u65f6\u949f\u751f\u6210\uff1a100ns \u5468\u671f<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\ninitial begin<br \/>\nforever #(PERIOD\/2) hclk = ~hclk;<br \/>\nend<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u4e3b\u6d4b\u8bd5\u6d41\u7a0b\uff08\u6838\u5fc3\uff01\uff09<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\ninitial begin<br \/>\n\/\/ \u521d\u59cb\u5316\u4fe1\u53f7<br \/>\ntestcase = 0;<br \/>\nhreset_n = 1;<br \/>\nhclk = 1;<br \/>\nxfr_reg = 0;<br \/>\nreq_0_trig= 0;<br \/>\nreq_1_trig= 0;<br \/>\nreq_2_trig= 0;<br \/>\nreq_3_trig= 0;<\/p>\n<p>tb_ch_en_0=0;<br \/>\ntb_ch_en_1=0;<br \/>\ntb_ch_en_2=0;<br \/>\ntb_ch_en_3=0;<\/p>\n<p>tb_ch_tgt_0=0;<br \/>\ntb_ch_tgt_1=0;<br \/>\ntb_ch_tgt_2=0;<br \/>\ntb_ch_tgt_3=0;<\/p>\n<p>\/\/ \u590d\u4f4d<br \/>\n#(PERIOD*20) hreset_n = 0;<br \/>\n#(PERIOD*20) hreset_n = 1;<\/p>\n<p><strong>\/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/strong><br \/>\n<strong>\/\/ \u6d4b\u8bd5\u7528\u4f8b 1\uff1a\u5185\u5b58 \u2192 \u5916\u8bbe<\/strong><br \/>\n<strong>\/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/strong><br \/>\ntestcase = 1;<\/p>\n<p>\/\/ \u914d\u7f6e\u901a\u90530\u6e90\u5730\u5740<br \/>\n#(PERIOD*1) AHB_SIGNLE_WR(CH0_SOUR, 32&#8217;h4001_1000);<br \/>\n\/\/ \u914d\u7f6e\u901a\u90530\u76ee\u6807\u5730\u5740<br \/>\n#(PERIOD*1) AHB_SIGNLE_WR(CH0_DEST, 32&#8217;h4001_0000);<br \/>\n\/\/ \u914d\u7f6e\u901a\u90530\u63a7\u5236\u5bc4\u5b58\u5668\uff1a\u957f\u5ea6+\u4f7f\u80fd<br \/>\n#(PERIOD*1) AHB_SIGNLE_WR(CH0_CTRL, 32&#8217;h900 + CH0_EN);<\/p>\n<p>\/\/ \u6253\u5f00\u901a\u90530<br \/>\ntb_ch_en_0 = 1;<br \/>\ntb_ch_tgt_0 = 0;<\/p>\n<p>#(PERIOD*60);<\/p>\n<p>\/\/ \u89e6\u53d19\u6b21 DMA \u8bf7\u6c42<br \/>\nrepeat (9) begin<br \/>\n#(PERIOD*1) req_0_trig = 1;<br \/>\n#(PERIOD*1) req_0_trig = 0;<br \/>\n#(PERIOD*10);<br \/>\nend<\/p>\n<p>#(PERIOD*300);<\/p>\n<p>\/\/ \u590d\u4f4d<br \/>\n#(PERIOD*20) hreset_n = 0;<br \/>\n#(PERIOD*20) hreset_n = 1;<\/p>\n<p><strong>\/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/strong><br \/>\n<strong>\/\/ \u6d4b\u8bd5\u7528\u4f8b 2\uff1a\u5916\u8bbe \u2192 \u5185\u5b58<\/strong><br \/>\n<strong>\/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/strong><br \/>\ntestcase = 2;<\/p>\n<p>\/\/ \u914d\u7f6e\u901a\u90530<br \/>\n#(PERIOD*1) AHB_SIGNLE_WR(CH0_SOUR, 32&#8217;h4001_0000);<br \/>\n#(PERIOD*1) AHB_SIGNLE_WR(CH0_DEST, 32&#8217;h4001_1000);<br \/>\n#(PERIOD*1) AHB_SIGNLE_WR(CH0_CTRL, 32&#8217;ha00 + CH0_TGT + CH0_EN);<\/p>\n<p>tb_ch_en_0 = 1;<br \/>\ntb_ch_tgt_0 = 0;<\/p>\n<p>\/\/ \u89e6\u53d110\u6b21DMA\u8bf7\u6c42<br \/>\nrepeat (10) begin<br \/>\n#(PERIOD*1) req_0_trig = 1;<br \/>\n#(PERIOD*1) req_0_trig = 0;<br \/>\n#(PERIOD*20);<br \/>\nend<\/p>\n<p>#(PERIOD*300);<\/p>\n<p>\/\/ \u7ed3\u675f\u4eff\u771f<br \/>\n$finish;<br \/>\nend<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u6ce2\u5f62dump\uff1a\u4fdd\u5b58\u6ce2\u5f62\u6587\u4ef6\uff0c\u7528\u4e8eVerdi\u67e5\u770b<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\ninitial begin<br \/>\n$fsdbDumpfile(&#8220;test_dma.fsdb&#8221;);<br \/>\n$fsdbDumpvars(0,&#8221;test_dma&#8221;);<br \/>\n$fsdbDumpMDA();<br \/>\nend<\/p>\n<p>endmodule<\/p>\n<p><strong>\u4e09\u3001\u573a\u666f\u5316\u5927\u767d\u8bdd\uff08\u6700\u5173\u952e\uff09<\/strong><br \/>\n<strong>\u628a test_dma.v \u60f3\u8c61\u6210\uff1a<\/strong><br \/>\n<strong>DMA \u7684\u201c\u8003\u573a + \u76d1\u8003\u8001\u5e08 + \u5047\u5b66\u751f\u201d<\/strong><br \/>\n<strong>\u2022 dmac\uff1a\u8003\u751f\uff08DMA \u63a7\u5236\u5668\uff09<\/strong><br \/>\n<strong>\u2022 test_dma\uff1a\u8003\u573a<\/strong><br \/>\n<strong>\u2022 AHB \u4efb\u52a1\uff1a\u5047 CPU\uff08\u8001\u5e08\u53d1\u5377\u5b50\uff09<\/strong><br \/>\n<strong>\u2022 peri_req\uff1a\u5047\u5916\u8bbe\uff08\u5b66\u751f\u8981\u4ea4\u4f5c\u4e1a\uff09<\/strong><br \/>\n<strong>\u2022 \u6ce2\u5f62\u6587\u4ef6\uff1a\u76d1\u63a7\u5f55\u50cf<\/strong><\/p>\n<p><strong>\u6574\u4e2a\u8003\u8bd5\u6d41\u7a0b\uff1a<\/strong><br \/>\n<strong>1. \u590d\u4f4d \u2192 \u8003\u751f\u5750\u597d<\/strong><br \/>\n<strong>2. CPU \u914d\u7f6e DMA\uff08\u53d1\u5377\u5b50\uff09\uff1a<\/strong><br \/>\n<strong>\u25e6 \u6e90\u5730\u5740<\/strong><br \/>\n<strong>\u25e6 \u76ee\u6807\u5730\u5740<\/strong><br \/>\n<strong>\u25e6 \u4f20\u8f93\u957f\u5ea6<\/strong><br \/>\n<strong>\u25e6 \u542f\u52a8\u901a\u9053<\/strong><br \/>\n<strong>3. \u6a21\u62df\u5916\u8bbe\u53d1\u8bf7\u6c42\uff1a\u6211\u8981\u4f20\u6570\u636e<\/strong><br \/>\n<strong>4. DMA \u5e94\u7b54 + \u642c\u6570\u636e<\/strong><br \/>\n<strong>5. \u770b\u6ce2\u5f62 \u5bf9\u4e0d\u5bf9<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>test_dma.v = DMA \u63a7\u5236\u5668\u7684\u4eff\u771f\u6d4b\u8bd5\u5e73\u53f0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u4f8b\u5316\u4f60\u524d\u9762\u7684 dmac \u9876\u5c42 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u7528 sim_ahb_task \u6a21\u62df CPU \u914d\u7f6e DMA \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u6a21\u62df \u5916\u8bbe\u89e6\u53d1 DMA \u8bf7\u6c42 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2022 \u81ea\u52a8\u8dd1\u6d4b\u8bd5\u7528\u4f8b\uff0c\u770b DMA \u642c\u6570\u636e\u5bf9\u4e0d\u5bf9 `timescale 1ns\/10ps \/\/ ============================== \/\/ \u6a21\u5757\uff1aDMA \u4eff\u771f\u6d4b\u8bd5\u9876\u5c42 \/\/ \u4f5c\u7528\uff1a\u7ed9DMA\u4f9b\u7535\u3001\u6a21\u62dfCPU\u3001\u6a21\u62df\u5916\u8bbe\u3001\u8dd1\u6d4b\u8bd5\u7528\u4f8b \/\/ ============================== module test_dma; \/\/ \u65f6\u949f\u5468\u671f\uff1a100ns \u2192 10MHz parameter PERIOD = 100; \/\/ DMA \u5bc4\u5b58\u5668\u57fa\u5730\u5740\uff08\u548c dmac_intf \u4e00\u81f4\uff09 parameter BASE_ADDR= 32&#8217;h4000_0000; \/\/ \u901a\u9053\u4f7f\u80fd parameter CH0_EN = 1; parameter CH1_EN = 1; parameter CH2_EN = 1; parameter CH3_EN = 1; \/\/ \u901a\u9053\u65b9\u5411\u914d\u7f6e parameter CH0_TGT = 32&#8217;h10; parameter CH1_TGT = 32&#8217;h10; parameter CH2_TGT = 32&#8217;h10; parameter CH3_TGT = 32&#8217;h10; \/\/ ============================== \/\/ DMA \u5bc4\u5b58\u5668\u5730\u5740\u6620\u5c04\uff08\u548c dmac_intf \u5b8c\u5168\u5bf9\u5e94\uff09 \/\/ ============================== parameter CH0_CTRL = BASE_ADDR + 32&#8217;h0; \/\/ \u901a\u90530\u63a7\u5236 parameter CH1_CTRL = BASE_ADDR + 32&#8217;h12; parameter CH2_CTRL = BASE_ADDR + 32&#8217;h24; parameter CH3_CTRL = BASE_ADDR + 32&#8217;h36; parameter CH0_SOUR = BASE_ADDR + 32&#8217;h4; \/\/ \u901a\u90530\u6e90\u5730\u5740 parameter CH1_SOUR = BASE_ADDR + 32&#8217;h16; parameter CH2_SOUR = BASE_ADDR + 32&#8217;h28; parameter CH3_SOUR = BASE_ADDR + 32&#8217;h40; parameter CH0_DEST = BASE_ADDR + 32&#8217;h8; \/\/ \u901a\u90530\u76ee\u6807\u5730\u5740 parameter CH1_DEST = BASE_ADDR + 32&#8217;h20; parameter CH2_DEST = BASE_ADDR + 32&#8217;h32; parameter CH3_DEST = BASE_ADDR + 32&#8217;h44; \/\/ \u6d4b\u8bd5\u7528\u4f8b\u7f16\u53f7 integer testcase; \/\/ \u8ba1\u6570\u5668 reg [7:0] cnt; \/\/ \u65f6\u949f\u3001\u590d\u4f4d reg hreset_n, hclk; \/\/ ============================== \/\/ AHB \u4e3b\u673a\u4fe1\u53f7\uff08\u6a21\u62df CPU\uff09 \/\/ ============================== reg cpu_s_hsel; \/\/ \u7247\u9009 reg [31:0] cpu_s_haddr; \/\/ \u5730\u5740 reg [31:0] cpu_s_hwdata; \/\/ \u5199\u6570\u636e reg cpu_s_hwrite; \/\/ \u8bfb\u5199 reg [1:0] cpu_s_htrans; \/\/ \u4f20\u8f93\u7c7b\u578b reg [2:0] cpu_s_hburst; \/\/ \u7a81\u53d1\u7c7b\u578b reg [2:0] cpu_s_hsize; \/\/ \u4f4d\u5bbd reg [3:0] cpu_s_hprot; \/\/ \u4fdd\u62a4 reg cpu_s_hlock; \/\/ \u9501\u5b9a reg cpu_s_hbusreq; \/\/ \u603b\u7ebf\u8bf7\u6c42 \/\/ AHB \u8bfb\u6570\u636e\u3001DMA \u5c31\u7eea\u4fe1\u53f7 wire [31:0] hrdata; wire hreadyout_from_dmaslv; \/\/ \u4e34\u65f6\u5bc4\u5b58\u5668 reg [31:0] xfr_reg; \/\/ ============================== \/\/ \u5916\u8bbe DMA \u8bf7\u6c42\u89e6\u53d1\u4fe1\u53f7\uff08Testbench \u5185\u90e8\u7528\uff09 \/\/ ===========================&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1430","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1430"}],"version-history":[{"count":2,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1430\/revisions"}],"predecessor-version":[{"id":1432,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1430\/revisions\/1432"}],"wp:attachment":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1430"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}