{"id":679,"date":"2024-09-02T11:00:37","date_gmt":"2024-09-02T02:00:37","guid":{"rendered":"https:\/\/rtlearner.com\/?p=679"},"modified":"2024-09-04T10:18:36","modified_gmt":"2024-09-04T01:18:36","slug":"verilog-apb-interface-intro-bfm","status":"publish","type":"post","link":"https:\/\/rtlearner.com\/en\/verilog-apb-interface-intro-bfm\/","title":{"rendered":"[Verilog] \uc2e4\uc804 1 &#8211; APB interface intro, BFM"},"content":{"rendered":"\n<p>\uc774\uc81c Verilog \uc2e4\uc804\uc73c\ub85c \ub4e4\uc5b4\uac00 \ubd05\uc2dc\ub2e4. \ubaa9\ud45c\ub294 APB interface\uac00 \ubb34\uc5c7\uc778\uc9c0, \ub610\ud55c register setting\uc758 \uac1c\ub150\uc744 \ub300\ud574 \uc774\ud574\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uadf8\ub7fc, \uc2dc\uc791\ud574 \ubcfc\uae4c\uc694?<\/p>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id679_697292-fe .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kb-table-of-content-nav.kb-table-of-content-id679_697292-fe .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id679_697292-fe .kb-table-of-contents-title{font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id679_697292-fe .kb-table-of-content-wrap .kb-table-of-content-list{font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}@media all and (max-width: 767px){.kb-table-of-content-nav.kb-table-of-content-id679_697292-fe .kb-table-of-contents-title{font-size:var(--global-kb-font-size-md, 1.25rem);}.kb-table-of-content-nav.kb-table-of-content-id679_697292-fe .kb-table-of-content-wrap .kb-table-of-content-list{font-size:var(--global-kb-font-size-sm, 0.9rem);}}<\/style>\n\n<style>.kadence-column679_cf736f-d0 > .kt-inside-inner-col{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kadence-column679_cf736f-d0 > .kt-inside-inner-col,.kadence-column679_cf736f-d0 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column679_cf736f-d0 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column679_cf736f-d0 > .kt-inside-inner-col{flex-direction:column;}.kadence-column679_cf736f-d0 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column679_cf736f-d0 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column679_cf736f-d0{position:relative;}@media all and (max-width: 1024px){.kadence-column679_cf736f-d0 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column679_cf736f-d0 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column679_cf736f-d0\"><div class=\"kt-inside-inner-col\">\n<p><strong>\uad00\ub828 \uae00<\/strong><\/p>\n\n\n\n<p>\u2705<a href=\"https:\/\/rtlearner.com\/verilog-simulation-settings\/\">Simulation \ud658\uacbd \uc138\ud305 (EDA playground, Icarus verilog)<\/a><\/p>\n\n\n\n<p>\u2705<a href=\"https:\/\/rtlearner.com\/verilog-apb-interface-design\/\">\uc2e4\uc804 2 \u2013 APB interface design<\/a><\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Counter RTL design<\/h2>\n\n\n\n<p>\uba3c\uc800 \uac04\ub2e8\ud55c counter\ub97c \uc124\uacc4\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/top.v\n`timescale 1ns\/10ps\n\nmodule top();\n\n    parameter period_clk = 10;\n\n    reg        clk;\n    reg        resetn;\n    wire [7:0] test;\n\n    \/\/clk\n    always #(period_clk*0.5) clk = ~clk;\n\n    \/\/instance\n    counter u_counter (\n         .clk    (clk   )\n        ,.resetn (resetn)\n        ,.test   (test  )\n    );\n\n    initial begin\n        clk   = 1'b0;\n        resetn = 1'b0;\n\n        #(period_clk);\n        resetn = 1'b1;\n\n        #1000 $finish;\n    end\n\n    initial begin\n        $dumpfile (&quot;test.vcd&quot;);\n        $dumpvars();\n    end\n\nendmodule\n\n\/\/counter.v\nmodule counter (\n     input  wire        clk\n    ,input  wire        resetn\n    ,output wire [ 7:0] test\n);\n\n    reg  [ 7:0] cnt;\n\n    always @(posedge clk or negedge resetn) begin\n        if (!resetn)           cnt &lt;= 8'h0;\n        else if (cnt == 8'd10) cnt &lt;= 8'h0;\n        else                   cnt &lt;= (cnt + 1'b1);\n    end\n\n    assign test = cnt;\n\nendmodule\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/top.v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">`timescale<\/span><span style=\"color: #D8DEE9FF\"> 1ns<\/span><span style=\"color: #81A1C1\">\/<\/span><span style=\"color: #D8DEE9FF\">10ps<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> top();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> period_clk <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">        clk;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">        resetn;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] test;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/clk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> #<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">period_clk*<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">clk<\/span><span style=\"color: #D8DEE9FF\"> = ~<\/span><span style=\"color: #81A1C1\">clk;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">counter<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_counter<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">         .clk    (clk   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.resetn (resetn)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.test   (test  )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    )<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        clk   <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        resetn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        #(period_clk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        resetn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #B48EAD\">#1000<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">$finish<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">$dumpfile<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #A3BE8C\">&quot;test.vcd&quot;<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">$dumpvars<\/span><span style=\"color: #D8DEE9FF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/counter.v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> counter (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">     <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        clk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        resetn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [ <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] test<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  [ <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] cnt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> clk <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">negedge<\/span><span style=\"color: #D8DEE9FF\"> resetn) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9FF\">resetn)           cnt <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;h0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (cnt <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;d10<\/span><span style=\"color: #D8DEE9FF\">) cnt <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;h0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\">                   cnt <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> (cnt <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> test <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> cnt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Testbench\uc5d0\uc11c\ub294 clock\uc744 \uc0dd\uc131\ud574 \uc8fc\uace0 reset\uc744 simulation \uc2dc\uc791 \ud6c4 \uc77c\uc815 \uc2dc\uac04 \ub4a4\uc5d0 \ud480\uc5b4\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<p>Counter module\uc5d0\uc11c\ub294 reset\uc774 \ud480\ub9ac\uba74 cnt \uac12\uc774 clock\uc5d0 \ub3d9\uae30\ud654\ub418\uc5b4 \uc99d\uac00\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 0x10\uc774 \ub418\uba74 0x0\uc73c\ub85c \ucd08\uae30\ud654\ub429\ub2c8\ub2e4. Simulation \uacb0\uacfc\ub97c \ud655\uc778\ud574 \ubcfc\uae4c\uc694?<\/p>\n\n\n<style>.kb-image679_22043b-89.kb-image-is-ratio-size, .kb-image679_22043b-89 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_22043b-89.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_22043b-89 .kb-image-is-ratio-size{align-self:unset;}.kb-image679_22043b-89 figure{max-width:650px;}.kb-image679_22043b-89 .image-is-svg, .kb-image679_22043b-89 .image-is-svg img{width:100%;}.kb-image679_22043b-89 .kb-image-has-overlay:after{opacity:0.3;}.kb-image679_22043b-89 img.kb-img, .kb-image679_22043b-89 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image679_22043b-89.kb-image-is-ratio-size, .kb-image679_22043b-89 .kb-image-is-ratio-size{max-width:300px;width:100%;}.kb-image679_22043b-89 figure{max-width:300px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image679_22043b-89\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/NgKtC\/btsIPuxy88Z\/0ihmnXpIrWA8SpWISmcLI1\/img.png\" alt=\"Simulation result\" class=\"kb-img\"\/><figcaption>Simulation result<\/figcaption><\/figure><\/div>\n\n\n\n<p>Top.v\uc758 signal waveform\uc785\ub2c8\ub2e4. Counter\uc758 cnt\uc5d0 assign \ub41c test \uac12\uc774 \uc6d0\ud558\ub294 \ub370\ub85c \ub2ec\ub77c\uc9c0\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Counter \uc218\uc815<\/h2>\n\n\n\n<p>\uadf8\ub7f0\ub370 cnt\ub97c \ucd08\uae30\ud654\ud574 \uc8fc\ub294 \uac12(\uc704\uc5d0\uc11c\ub294 0x10)\uc744 \uc720\uc800\uac00 \ub9c8\uc74c\ub300\ub85c \ubc14\uafc0 \uc218 \uc5c6\uc744\uae4c\uc694?? \ucf54\ub4dc\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uc218\uc815\ud574 \ubd05\uc2dc\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/top.v\n`timescale 1ns\/10ps\n\nmodule top();\n\n    parameter period_clk = 10;\n\n    reg        clk;\n    reg        resetn;\n    reg  [7:0] value; \/\/\ucd94\uac00\n    wire [7:0] test;\n\n    \/\/clk\n    always #(period_clk*0.5) clk = ~clk;\n\n    \/\/instance\n    counter u_counter (\n         .clk    (clk   )\n        ,.resetn (resetn)\n        ,.value  (value ) \/\/\ucd94\uac00\n        ,.test   (test  )\n    );\n\n    initial begin\n        clk    = 1'b0;\n        resetn = 1'b0;\n        value  = 8'h5; \/\/\ucd94\uac00\n\n        #(period_clk);\n        resetn = 1'b1;\n\t\t\n        #100 \/\/\ucd94\uac00\n        value  = 8'hA; \/\/\ucd94\uac00\n\n        #100 $finish;\n    end\n\n    initial begin\n        $dumpfile (&quot;test.vcd&quot;);\n        $dumpvars();\n    end\n\nendmodule\n\n\/\/counter.v\nmodule counter (\n     input  wire        clk\n    ,input  wire        resetn\n    ,input  wire [ 7:0] value \/\/\ucd94\uac00\n    ,output wire [ 7:0] test\n);\n\n    reg  [ 7:0] cnt;\n\n    always @(posedge clk or negedge resetn) begin\n        if (!resetn)           cnt &lt;= 8'h0;\n        else if (cnt == value) cnt &lt;= 8'h0; \/\/\uc218\uc815\n        else                   cnt &lt;= (cnt + 1'b1);\n    end\n\n    assign test = cnt;\n\nendmodule\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/top.v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">`timescale<\/span><span style=\"color: #D8DEE9FF\"> 1ns<\/span><span style=\"color: #81A1C1\">\/<\/span><span style=\"color: #D8DEE9FF\">10ps<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> top();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> period_clk <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">        clk;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">        resetn;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  [<\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] value; <\/span><span style=\"color: #616E88\">\/\/\ucd94\uac00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] test;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/clk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> #<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">period_clk*<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">clk<\/span><span style=\"color: #D8DEE9FF\"> = ~<\/span><span style=\"color: #81A1C1\">clk;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">counter<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_counter<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">         .clk    (clk   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.resetn (resetn)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.value  (value ) <\/span><span style=\"color: #616E88\">\/\/\ucd94\uac00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.test   (test  )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    )<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        clk    <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        resetn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        value  <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;h5<\/span><span style=\"color: #D8DEE9FF\">; <\/span><span style=\"color: #616E88\">\/\/\ucd94\uac00<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        #(period_clk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        resetn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #B48EAD\">#100<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">\/\/\ucd94\uac00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        value  <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;hA<\/span><span style=\"color: #D8DEE9FF\">; <\/span><span style=\"color: #616E88\">\/\/\ucd94\uac00<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #B48EAD\">#100<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">$finish<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">$dumpfile<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #A3BE8C\">&quot;test.vcd&quot;<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">$dumpvars<\/span><span style=\"color: #D8DEE9FF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/counter.v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> counter (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">     <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        clk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        resetn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [ <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] value <\/span><span style=\"color: #616E88\">\/\/\ucd94\uac00<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [ <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] test<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  [ <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] cnt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> clk <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">negedge<\/span><span style=\"color: #D8DEE9FF\"> resetn) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9FF\">resetn)           cnt <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;h0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (cnt <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> value) cnt <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8&#39;h0<\/span><span style=\"color: #D8DEE9FF\">; <\/span><span style=\"color: #616E88\">\/\/\uc218\uc815<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\">                   cnt <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> (cnt <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> test <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> cnt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc81c cnt\uac00 \uace0\uc815\ub41c \uac12\uc774 \uc544\ub2cc input \ub418\ub294 value\uc5d0 \uc758\ud574 \ucd08\uae30\ud654\ub429\ub2c8\ub2e4. Simulation \uacb0\uacfc\ub97c \ud655\uc778\ud574 \ubd05\uc2dc\ub2e4.<\/p>\n\n\n<style>.kb-image679_d58b22-4b.kb-image-is-ratio-size, .kb-image679_d58b22-4b .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_d58b22-4b.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_d58b22-4b .kb-image-is-ratio-size{align-self:unset;}.kb-image679_d58b22-4b figure{max-width:650px;}.kb-image679_d58b22-4b .image-is-svg, .kb-image679_d58b22-4b .image-is-svg img{width:100%;}.kb-image679_d58b22-4b .kb-image-has-overlay:after{opacity:0.3;}.kb-image679_d58b22-4b img.kb-img, .kb-image679_d58b22-4b .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image679_d58b22-4b.kb-image-is-ratio-size, .kb-image679_d58b22-4b .kb-image-is-ratio-size{max-width:300px;width:100%;}.kb-image679_d58b22-4b figure{max-width:300px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image679_d58b22-4b\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/ecdybu\/btsIOqo8ygU\/xOG0cNzBKxcMEBq92IlB6K\/img.png\" alt=\"Simulation result\" class=\"kb-img\"\/><figcaption>Simulation result<\/figcaption><\/figure><\/div>\n\n\n\n<p>\ucc28\uc774\uac00 \ubcf4\uc774\uc2dc\ub098\uc694? Value \uac12\uc744 \uc870\uc815\ud568\uc73c\ub85c\uc368 module\uc758 \uc791\ub3d9 \ubc29\uc2dd\uc744 \ubc14\uafc0 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testbench\uac00 \uc544\ub2cc CPU control<\/h2>\n\n\n\n<p>\uc704\uc758 \uc608\uc2dc\uc5d0\uc11c module\uc5d0 \ud544\uc694\ud55c signal\uc744 testbench\uc5d0\uc11c \ubc14\uafd4\uc8fc\uba74\uc11c \uc791\ub3d9 \ubc29\uc2dd\uc744 \ubc14\uafe8\ub294\ub370\uc694, \uc2e4\uc81c chip\uc5d0\uc11c\ub294 CPU\uac00 \uc774\ub7ec\ud55c \uc5ed\ud560\uc744 \ud558\uac8c \ub429\ub2c8\ub2e4. CPU\ub294 bus\ub97c \ud1b5\ud574 \uac01 module(IP)\uc5d0 \uba85\ub839\uc744 \ub0b4\ub9ac\uba70, bus \uc911\uc5d0\uc11c\ub3c4 \ud45c\uc900\ud654\ub41c bus\uc778 AMBA bus\ub97c \ud1b5\ud574 \uba85\ub839\uc744 \ub0b4\ub9bc\uc73c\ub85c\uc368 IP\ub97c control \ud569\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-image679_3d938f-62.kb-image-is-ratio-size, .kb-image679_3d938f-62 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_3d938f-62.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_3d938f-62 .kb-image-is-ratio-size{align-self:unset;}.kb-image679_3d938f-62 figure{max-width:650px;}.kb-image679_3d938f-62 .image-is-svg, .kb-image679_3d938f-62 .image-is-svg img{width:100%;}.kb-image679_3d938f-62 .kb-image-has-overlay:after{opacity:0.3;}.kb-image679_3d938f-62 img.kb-img, .kb-image679_3d938f-62 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image679_3d938f-62.kb-image-is-ratio-size, .kb-image679_3d938f-62 .kb-image-is-ratio-size{max-width:280px;width:100%;}.kb-image679_3d938f-62 figure{max-width:280px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image679_3d938f-62\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/dGgq3W\/btsI5QsN1GA\/E4oDItUizDmJTwZPlS4TH0\/img.png\" alt=\"Testbench VS Chip\" class=\"kb-img\"\/><figcaption>Testbench VS Chip<\/figcaption><\/figure><\/div>\n\n\n\n<p>\ud558\uc9c0\ub9cc IP\ub9c8\ub2e4 \ud544\uc694\ud55c signal\uc740 \ub2e4\ub985\ub2c8\ub2e4. \uc704\uc5d0\uc11c \uc124\uacc4\ud55c counter\ub294 cnt\ub97c \ucd08\uae30\ud654\ud574 \uc8fc\ub294 value signal\uc774 \ud544\uc694\ud558\uc9c0\ub9cc, \uc608\ub97c \ub4e4\uc5b4 UART\ub294 baud rate \uad00\ub828\ub41c signal\uc774 \ud544\uc694\ud560 \uac81\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub807\ub4ef, IP\ub9c8\ub2e4 \ud544\uc694\ud55c signal\uc774 \ub2e4\ub974\uc9c0\ub9cc, CPU\uc640 IP\uac00 \uc5f0\uacb0\ub41c Bus\ub294 \ud45c\uc900\ud654\ub41c AMBA Bus\ub97c \uc4f0\uae30 \ub54c\ubb38\uc5d0 IP\uc5d0 \ub9de\uac8c signal\uc744 \ubcc0\ud658\ud574 \uc904 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">APB interface<\/h2>\n\n\n\n<p>\uadf8\ub798\uc11c \uc55e\uc73c\ub85c \uacf5\ubd80\ud560 APB interface\uac00 \ud544\uc694\ud55c \uac81\ub2c8\ub2e4. IP\uac00 APB bus \uae30\ubc18\uc774\uba74 APB Interface, AHB bus \uae30\ubc18\uc774\uba74 AHB Interface, AXI bus \uae30\ubc18\uc774\uba74 AXI Interface\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc800\ud76c\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c APB bus\ub97c \uae30\ubc18\uc73c\ub85c \ud55c Interface\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-image679_38a066-ab.kb-image-is-ratio-size, .kb-image679_38a066-ab .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_38a066-ab.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_38a066-ab .kb-image-is-ratio-size{align-self:unset;}.kb-image679_38a066-ab figure{max-width:650px;}.kb-image679_38a066-ab .image-is-svg, .kb-image679_38a066-ab .image-is-svg img{width:100%;}.kb-image679_38a066-ab .kb-image-has-overlay:after{opacity:0.3;}.kb-image679_38a066-ab img.kb-img, .kb-image679_38a066-ab .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image679_38a066-ab.kb-image-is-ratio-size, .kb-image679_38a066-ab .kb-image-is-ratio-size{max-width:280px;width:100%;}.kb-image679_38a066-ab figure{max-width:280px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image679_38a066-ab\"><figure class=\"aligncenter size-large\"><img data-dominant-color=\"bccdd6\" data-has-transparency=\"false\" style=\"--dominant-color: #bccdd6;\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"527\" src=\"https:\/\/rtlearner.com\/wp-content\/uploads\/2024\/08\/\uadf8\ub9bc2-1-1024x527.jpg\" alt=\"APB interface\" class=\"kb-img wp-image-680 not-transparent\" srcset=\"https:\/\/rtlearner.com\/wp-content\/uploads\/2024\/08\/\uadf8\ub9bc2-1-1024x527.jpg 1024w, https:\/\/rtlearner.com\/wp-content\/uploads\/2024\/08\/\uadf8\ub9bc2-1-300x155.jpg 300w, https:\/\/rtlearner.com\/wp-content\/uploads\/2024\/08\/\uadf8\ub9bc2-1-768x396.jpg 768w, https:\/\/rtlearner.com\/wp-content\/uploads\/2024\/08\/\uadf8\ub9bc2-1.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>APB interface<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">APB BFM (Bus functional Model)<\/h2>\n\n\n\n<p>Chip\uc5d0\uc11c IP\uc5d0 \uba85\ub839\uc744 \ub0b4\ub9ac\ub294 \uac83\uc740 CPU\uc785\ub2c8\ub2e4. \uadf8\ub798\uc11c IP\uc5d0\uc11c \uc0ac\uc6a9\ud560 interface\ub97c \uc124\uacc4\ud558\uace0 \uc774\ub97c \uac80\uc99d\ud558\uae30 \uc704\ud574\uc11c\ub294 \uba85\ub839\uc744 \ub0b4\ub9b4 CPU\uac00 \ud544\uc694\ud55c\ub370\uc694, \uac80\uc99d\ub9cc\uc744 \uc704\ud574 CPU\ub97c \uad6c\ud558\uae30\uc5d0\ub294 \ube44\ud6a8\uc728\uc801\uc785\ub2c8\ub2e4. \uadf8\ub798\uc11c CPU \uc5ed\ud560\uc744 \ud560 \uc218 \uc788\ub294 BFM \ubaa8\ub4c8\uc744 \ud1b5\ud574 interface\ub97c \uac80\uc99d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"module apb_bfm (\n     input  wire        pclk\n    ,input  wire        presetn\n    ,output reg         psel\n    ,output reg         penable\n    ,output reg  [31:0] paddr\n    ,output reg         pwrite\n    ,output reg  [31:0] pwdata\n    ,input  wire        pready\n    ,input  wire [31:0] prdata\n    ,input  wire        pslverr\n);\n\n    parameter delay = 1;\n\n    initial begin\n        psel    =  1'b0;\n        penable =  1'b0;\n        paddr   = 32'b0;\n        pwrite  =  1'b0;\n        pwdata  = 32'b0;\n    end\n \n    \/\/--------------------------------------------------\n    \/\/ task : APB single write\n    \/\/--------------------------------------------------\n    task apb_write;\n        input [31: 0] addr;\n        input [31: 0] data;\n        begin\n            wait (pready == 1'b1);\n            @(posedge pclk);\n            psel    &lt;= #(delay)  1'b1 ;\n            penable &lt;= #(delay)  1'b0 ;\n            paddr   &lt;= #(delay)  addr ;\n            pwrite  &lt;= #(delay)  1'b1 ; \/\/ WRITE\n            pwdata  &lt;= #(delay)  data ;\n            @(posedge pclk);\n            psel    &lt;= #(delay)  1'b1 ;\n            penable &lt;= #(delay)  1'b1 ;\n            paddr   &lt;= #(delay)  addr ;\n            pwrite  &lt;= #(delay)  1'b1 ; \/\/ WRITE\n            pwdata  &lt;= #(delay)  data ;\n            wait (pready == 1'b1);\n            @(posedge pclk);\n            psel    &lt;= #(delay)  1'b0 ;\n            penable &lt;= #(delay)  1'b0 ;\n            paddr   &lt;= #(delay) 32'h0 ;\n            pwrite  &lt;= #(delay)  1'b0 ;\n            pwdata  &lt;= #(delay) 32'h0 ;\n        end\n    endtask\n \n    \/\/--------------------------------------------------\n    \/\/ task : APB single read\n    \/\/--------------------------------------------------\n    task apb_read;\n        input  [31: 0] addr;\n        output [31: 0] result_data;\n        begin\n            wait (pready == 1'b1);\n            @(posedge pclk);\n            psel    &lt;= #(delay)  1'b1  ;\n            penable &lt;= #(delay)  1'b0  ;\n            paddr   &lt;= #(delay)  addr  ;\n            pwrite  &lt;= #(delay)  1'b0  ; \/\/ READ\n            pwdata  &lt;= #(delay) 32'h0  ;\n            @(posedge pclk);\n            psel    &lt;= #(delay)  1'b1  ;\n            penable &lt;= #(delay)  1'b1  ;\n            paddr   &lt;= #(delay)  addr  ;\n            pwrite  &lt;= #(delay)  1'b0  ; \/\/ READ\n            pwdata  &lt;= #(delay) 32'h0  ;\n            wait (pready == 1'b1);\n            @(posedge pclk);\n            paddr   &lt;= #(delay) 32'h0  ;\n            pwrite  &lt;= #(delay)  1'b0  ; \/\/ READ\n            psel    &lt;= #(delay)  1'b0  ;\n            penable &lt;= #(delay)  1'b0  ;\n            pwdata  &lt;= #(delay) 32'h0  ;\n            result_data = prdata;\n        end\n    endtask\n \nendmodule\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> apb_bfm (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">     <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        pclk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        presetn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">         psel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">         penable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] paddr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">         pwrite<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] pwdata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        pready<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] prdata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ,<\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        pslverr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> delay <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        psel    <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        penable <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        paddr   <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">32&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        pwrite  <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        pwdata  <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">32&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/--------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ task : APB single write<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/--------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">task<\/span><span style=\"color: #D8DEE9FF\"> apb_write;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] addr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">wait<\/span><span style=\"color: #D8DEE9FF\"> (pready <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            psel    <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            penable <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            paddr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  addr ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwrite  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\"> ; <\/span><span style=\"color: #616E88\">\/\/ WRITE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwdata  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  data ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            psel    <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            penable <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            paddr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  addr ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwrite  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\"> ; <\/span><span style=\"color: #616E88\">\/\/ WRITE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwdata  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  data ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">wait<\/span><span style=\"color: #D8DEE9FF\"> (pready <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            psel    <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            penable <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            paddr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay) <\/span><span style=\"color: #B48EAD\">32&#39;h0<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwrite  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwdata  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay) <\/span><span style=\"color: #B48EAD\">32&#39;h0<\/span><span style=\"color: #D8DEE9FF\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">endtask<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/--------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ task : APB single read<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/--------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">task<\/span><span style=\"color: #D8DEE9FF\"> apb_read;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] addr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] result_data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">wait<\/span><span style=\"color: #D8DEE9FF\"> (pready <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            psel    <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            penable <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            paddr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  addr  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwrite  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">  ; <\/span><span style=\"color: #616E88\">\/\/ READ<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwdata  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay) <\/span><span style=\"color: #B48EAD\">32&#39;h0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            psel    <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            penable <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            paddr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  addr  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwrite  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">  ; <\/span><span style=\"color: #616E88\">\/\/ READ<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwdata  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay) <\/span><span style=\"color: #B48EAD\">32&#39;h0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">wait<\/span><span style=\"color: #D8DEE9FF\"> (pready <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            paddr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay) <\/span><span style=\"color: #B48EAD\">32&#39;h0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwrite  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">  ; <\/span><span style=\"color: #616E88\">\/\/ READ<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            psel    <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            penable <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay)  <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            pwdata  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> #(delay) <\/span><span style=\"color: #B48EAD\">32&#39;h0<\/span><span style=\"color: #D8DEE9FF\">  ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            result_data <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> prdata;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">endtask<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704 \ucf54\ub4dc\ub97c \ubcf4\uba74 \ubaa8\ub4c8\uc5d0 2\uac00\uc9c0 task\uac00 \uc788\ub294\ub370\uc694, apb_write\uc640 apb_read\uc785\ub2c8\ub2e4. <a href=\"https:\/\/rtlearner.com\/amba-apb-bus\/\">APB Bus<\/a>\uc5d0 \uad00\ud574 \uc124\uba85\ud560 \ub54c \ub9e4\uc6b0 \uac04\ub2e8\ud55c \ubc84\uc2a4\ub77c\uace0 \ud55c \uac83\uc744 \uae30\uc5b5\ud558\uc2dc\ub098\uc694? \uc774 \uac04\ub2e8\ud55c \ubaa8\ub4c8\ub85c\ub3c4 CPU\uac00 APB bus\uc5d0 \ub0b4\ub9ac\ub294 \uba85\ub839\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\uba74 testbench\ub3c4 \uc791\uc131\ud574 \ubcfc\uae4c\uc694?<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"`timescale 1ns\/10ps\n\nmodule top();\n\n    parameter period_pclk = 10;\n\n    reg         pclk;\n    reg         presetn;\n\n    wire        psel;\n    wire        penable;\n    wire [31:0] paddr;\n    wire        pwrite;\n    wire [31:0] pwdata;\n    wire        pready;\n    wire [31:0] prdata;\n    wire        pslverr;\n\n    \/\/clk\n    always #(period_pclk*0.5) pclk = ~pclk;\n\n    assign pready  = 1'b1;\n    assign pslverr = 1'b0;\n\n    \/\/instance\n    apb_bfm u_apb (\n         .pclk    (pclk    )\n        ,.presetn (presetn ) \n        ,.psel    (psel    ) \n        ,.penable (penable ) \n        ,.paddr   (paddr   ) \n        ,.pwrite  (pwrite  ) \n        ,.pwdata  (pwdata  ) \n        ,.pready  (pready  ) \n        ,.prdata  (prdata  ) \n        ,.pslverr (pslverr ) \n    );\n\n    initial begin\n        pclk    = 1'b0;\n        presetn = 1'b0;\n\n        #(period_pclk);\n        presetn = 1'b1;\n\n        \/\/u_apb(apb_bfm)\uc758 apb_write task \uc2e4\ud589\n        #(10*period_pclk);\n        u_apb.apb_write(32'h1 ,32'hAA);\n\n        #(10*period_pclk);\n        u_apb.apb_write(32'h10,32'h55);\n\n        #100 $finish;\n    end\n\n    initial begin\n        $dumpfile (&quot;test.vcd&quot;);\n        $dumpvars();\n    end\n\nendmodule\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">`timescale<\/span><span style=\"color: #D8DEE9FF\"> 1ns<\/span><span style=\"color: #81A1C1\">\/<\/span><span style=\"color: #D8DEE9FF\">10ps<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> top();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> period_pclk <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">         pclk;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">         presetn;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        psel;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        penable;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] paddr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        pwrite;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] pwdata;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        pready;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] prdata;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">        pslverr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/clk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> #<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">period_pclk*<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">pclk<\/span><span style=\"color: #D8DEE9FF\"> = ~<\/span><span style=\"color: #81A1C1\">pclk;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> pready  <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> pslverr <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">apb_bfm<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_apb<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">         .pclk    (pclk    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.presetn (presetn ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.psel    (psel    ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.penable (penable ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.paddr   (paddr   ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.pwrite  (pwrite  ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.pwdata  (pwdata  ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.pready  (pready  ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.prdata  (prdata  ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        ,.pslverr (pslverr ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    )<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        pclk    <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        presetn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        #(period_pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        presetn <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/u_apb(apb_bfm)\uc758 apb_write task \uc2e4\ud589<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        #(<\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\">period_pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        u_apb.apb_write(<\/span><span style=\"color: #B48EAD\">32&#39;h1<\/span><span style=\"color: #D8DEE9FF\"> ,<\/span><span style=\"color: #B48EAD\">32&#39;hAA<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        #(<\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\">period_pclk);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        u_apb.apb_write(<\/span><span style=\"color: #B48EAD\">32&#39;h10<\/span><span style=\"color: #D8DEE9FF\">,<\/span><span style=\"color: #B48EAD\">32&#39;h55<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #B48EAD\">#100<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">$finish<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">initial<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">$dumpfile<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #A3BE8C\">&quot;test.vcd&quot;<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">$dumpvars<\/span><span style=\"color: #D8DEE9FF\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Testbench\ub97c \ubcf4\uba74 assign \ubb38\uc744 \ud1b5\ud574 pready\uac00 1&#8217;b1\ub85c, pslverr\uac00 1&#8217;b0\uc73c\ub85c tie(\uace0\uc815) \ub418\uc5b4 \uc788\ub294 \uac83\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. pslverr\ub294 tie \ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\uc9c0\ub9cc pready\ub294 apb_bfm\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \ubc18\ub4dc\uc2dc tie \uc2dc\ucf1c\uc918\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc2e4\ubb34\uc5d0\uc11c\ub3c4 tie \uc2dc\ud0b5\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"task apb_write;\n        input [31: 0] addr;\n        input [31: 0] data;\n        begin\n            wait (pready == 1'b1);\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">task<\/span><span style=\"color: #D8DEE9FF\"> apb_write;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] addr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\"> [<\/span><span style=\"color: #B48EAD\">31<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">] data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">wait<\/span><span style=\"color: #D8DEE9FF\"> (pready <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1&#39;b1<\/span><span style=\"color: #D8DEE9FF\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Simulation\uc744 \uc2e4\ud589\ud558\uba74 reset\uc744 \ud480\uace0 apb_write task\ub97c \ub450 \ubc88 \uc2e4\ud589\ud569\ub2c8\ub2e4. \uadf8\ub7fc, \uc704 testbench\ub97c \uc2e4\ud589\ud574 \ubcfc\uae4c\uc694??<\/p>\n\n\n<style>.kb-image679_6b385e-f8.kb-image-is-ratio-size, .kb-image679_6b385e-f8 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_6b385e-f8.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image679_6b385e-f8 .kb-image-is-ratio-size{align-self:unset;}.kb-image679_6b385e-f8 figure{max-width:650px;}.kb-image679_6b385e-f8 .image-is-svg, .kb-image679_6b385e-f8 .image-is-svg img{width:100%;}.kb-image679_6b385e-f8 .kb-image-has-overlay:after{opacity:0.3;}.kb-image679_6b385e-f8 img.kb-img, .kb-image679_6b385e-f8 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image679_6b385e-f8.kb-image-is-ratio-size, .kb-image679_6b385e-f8 .kb-image-is-ratio-size{max-width:280px;width:100%;}.kb-image679_6b385e-f8 figure{max-width:280px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image679_6b385e-f8\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/oUvd0\/btsIPKHwvSg\/e7dQQyl8vGfQUXLHvIzGK1\/img.png\" alt=\"APB write transfer \ube44\uad50\" class=\"kb-img\"\/><figcaption>APB write transfer \ube44\uad50<\/figcaption><\/figure><\/div>\n\n\n\n<p>APB bus Specification\uacfc testbench sim. \uacb0\uacfc\ub97c \ube44\uad50\ud558\uba74 \uac19\uc740 \uacb0\uacfc\uc778 \uac83\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. 0x1 address\uc5d0 0xAA data\ub97c \uc785\ub825\ud55c simulation\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub85c\uc368 interface\ub97c \uac80\uc99d\ud560 \ud658\uacbd\uc744 \uc7a1\uc558\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uc9c1\uc811 module\uc744 \uc124\uacc4\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.kadence-column679_a50864-0f > .kt-inside-inner-col{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kadence-column679_a50864-0f > .kt-inside-inner-col,.kadence-column679_a50864-0f > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column679_a50864-0f > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column679_a50864-0f > .kt-inside-inner-col{flex-direction:column;}.kadence-column679_a50864-0f > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column679_a50864-0f > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column679_a50864-0f{position:relative;}@media all and (max-width: 1024px){.kadence-column679_a50864-0f > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column679_a50864-0f > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column679_a50864-0f\"><div class=\"kt-inside-inner-col\">\n<p><strong>\uad00\ub828 \uae00<\/strong><\/p>\n\n\n\n<p>\u2705<a href=\"https:\/\/rtlearner.com\/verilog-simulation-settings\/\">Simulation \ud658\uacbd \uc138\ud305 (EDA playground, Icarus verilog)<\/a><\/p>\n\n\n\n<p>\u2705<a href=\"https:\/\/rtlearner.com\/verilog-apb-interface-design\/\">\uc2e4\uc804 2 \u2013 APB interface design<\/a><\/p>\n<\/div><\/div>\n\n\n\n<p>\ucc38\uace0: <a href=\"https:\/\/developer.arm.com\/documentation\/ihi0024\/latest\/\" target=\"_blank\" rel=\"noopener\">ARM\u00ae AMBA APB Protocol Specification<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Now, let's get into some practical Verilog. The goal is to understand what an APB interface is, and\u2026<\/p>","protected":false},"author":1,"featured_media":680,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[39],"tags":[40,99],"class_list":["post-679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-verilog","tag-verilog","tag-apb-interface"],"_links":{"self":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/comments?post=679"}],"version-history":[{"count":2,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/679\/revisions"}],"predecessor-version":[{"id":731,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/679\/revisions\/731"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/media\/680"}],"wp:attachment":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/media?parent=679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/categories?post=679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/tags?post=679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 69b92da9d36f73cd2808d6e8. Config Timestamp: 2026-03-17 10:32:09 UTC, Cached Timestamp: 2026-04-18 14:57:19 UTC -->