覆蓋 defparam 與 #() 傳參詳解)
[TOC](Verilog 參數(shù)覆蓋 defparam 與 #() 傳參詳解)前言在 Verilog 開發(fā)中經(jīng)常會遇到這樣的場景同一個(gè)模塊仿真時(shí)需要小參數(shù)快速驗(yàn)證邏輯板級驗(yàn)證時(shí)需要大參數(shù)匹配真實(shí)硬件。如果為仿真和上板維護(hù)兩套代碼不僅冗余還容易出錯(cuò)。Verilog 提供了參數(shù)覆蓋機(jī)制通過defparam或#()命名傳參可以在例化時(shí)修改模塊內(nèi)部parameter的默認(rèn)值實(shí)現(xiàn)**“一套代碼兩種參數(shù)”**。本文以計(jì)數(shù)器為例詳細(xì)講解兩種方式的用法、區(qū)別與最佳實(shí)踐。一、問題背景仿真與板級的參數(shù)沖突先看一個(gè)典型的計(jì)數(shù)器模塊module bin_counter( input wire clk, input wire rst_n, output reg [7:0] count ); parameter MCNT 25d49_999_999; // 板級驗(yàn)證時(shí)的計(jì)數(shù)最大值 always (posedge clk or negedge rst_n) begin if (!rst_n) count 0; else if (count MCNT) count 0; else count count 1b1; end endmoduleparameter MCNT是模塊級常量編譯時(shí)確定板級驗(yàn)證使用49_999_99950MHz 時(shí)鐘下約 1 秒翻轉(zhuǎn)一次但仿真時(shí)計(jì)數(shù)器要跑近5000 萬個(gè)周期才能翻轉(zhuǎn)一次仿真時(shí)間極長二、方案一defparam 覆蓋參數(shù)defparam的作用是在 TestBench 中重新覆蓋設(shè)計(jì)文件里parameter的默認(rèn)值timescale 1ns / 1ps module tb_bin_counter; reg clk, rst_n; wire [7:0] count; // 例化被測模塊 bin_counter bin_counter_inst ( .clk (clk), .rst_n (rst_n), .count (count) ); // ★ 關(guān)鍵用 defparam 覆蓋 MCNT仿真時(shí)計(jì)數(shù)器只需數(shù)到 99 就翻轉(zhuǎn) defparam bin_counter_inst.MCNT 25d99; // 時(shí)鐘生成 initial begin clk 1b0; forever #10 clk ~clk; // 50MHz end // 激勵 initial begin rst_n 1b0; #50; rst_n 1b1; // 等待足夠周期觀察翻轉(zhuǎn) repeat(200) (posedge clk); $display(仿真完成 %0t, $time); $finish; end endmodule執(zhí)行效果設(shè)計(jì)文件中MCNT的默認(rèn)值49_999_999被覆蓋為99仿真時(shí)計(jì)數(shù)器每數(shù)到 99 就歸零翻轉(zhuǎn)仿真速度大幅提升。defparam 語法要點(diǎn)defparam 實(shí)例名.參數(shù)名 新值;bin_counter_inst是模塊例化后的實(shí)例名不是模塊原名MCNT是設(shè)計(jì)文件中定義的parameter名稱defparam語句可以寫在實(shí)例化語句的前面或后面編譯器會在編譯階段統(tǒng)一解析三、方案二#() 命名參數(shù)傳遞推薦除了defparam還可以在例化時(shí)直接用#()傳參bin_counter #( .MCNT(25d99) ) bin_counter_inst ( .clk (clk), .rst_n (rst_n), .count (count) );四、兩種方式對比對比項(xiàng)defparam#()命名傳參語法defparam inst.PARAM val;module #(.PARAM(val)) inst(...)可讀性參數(shù)與例化分離需上下對照參數(shù)緊跟例化一目了然綜合支持部分綜合工具不支持全面支持推薦度適合快速仿真調(diào)試新設(shè)計(jì)推薦使用五、總結(jié)parameter MCNT在設(shè)計(jì)文件中定義計(jì)數(shù)終值的默認(rèn)值面向板級驗(yàn)證defparam bin_counter_inst.MCNT在激勵文件中將該值覆蓋為更小的數(shù)面向仿真加速。兩者配合實(shí)現(xiàn)了**“一套代碼兩種參數(shù)”**——仿真時(shí)快速驗(yàn)證邏輯板級驗(yàn)證時(shí)使用真實(shí)參數(shù)值互不影響。在實(shí)際項(xiàng)目中建議仿真調(diào)試階段優(yōu)先使用#()命名傳參代碼結(jié)構(gòu)更清晰遺留代碼維護(hù)理解defparam的覆蓋機(jī)制避免參數(shù)沖突多實(shí)例場景不同實(shí)例可以覆蓋為不同值靈活適配各子模塊需求