hdl语言哪种语言类似c,Verilog HDL笔记
《設計與驗證 Verilog HDL》
設計與驗證的發展歷程
早期:卡諾圖設計,面包板驗證
中期:原理圖設計,EDA工具仿真驗證
后期:硬件描述語言HDL設計,EDA工具仿真驗證
抽象層次不斷提高
HDL可以從算法/系統級>功能級>行為級>寄存器傳輸級(RTL)>門級和開關級不同的層次描述數字電路系統。
通過EDA工具將高層次的電路描述解析到門級等低層次的電路描述(網表)的過程就叫做"綜合"(Synthesize),或者稱邏輯綜合(綜合時會根據"約束條件"優化)
最成熟的綜合是RTL級到門級的綜合
Verilog不僅定義了語法,還對每個語法結構都清晰定義了仿真語義,從而便于仿真調試
Verilog集成了C語言的語法結構和操作符,易學易用,具有很強的擴展性
VHDL(Very High Speed Integrated Circuit HDL,超高速集成電路描述語言)的特點是描述嚴謹
幾種設計方法:
原理圖直觀,便于理解,但在大型設計中可維護性差,不利于提高模塊重用性
HDL輸入:利于自頂向下設計,利于模塊劃分和重用,可移植性好,通用性好,設計不因芯片工藝和結構變化而變化,利于向ASIC移植
波形輸入和狀態機輸入:是最常用的輔助設計方法,EDA工具可自動根據兩種輸入生成HDL代碼,應用受局限,維護性不高
推薦初學者:首選HDL方式,在某些要求使用圖形描述設計頂層的情況下才使用原理圖,不要在設計頂層以外的其他層次使用原理圖,不要依賴波形設計工具(因為復雜的測試激勵無法用波形工具描述)
Verilog和VHDL:
兩者都能勝任數字電路系統設計任務
VHDL最初用作文檔來描述數字硬件的行為,描述性和抽象性更強,更適合描述更高層次(行為級,系統級)
Verilog最初為更簡捷、有效的描述數字電路和仿真而設計,易學易懂
在這兩者基礎上又發展處很多更抽象的硬件描述語言:SystemVerilog、Superlog、SystemC、CoWare C等
Verilog寄存器和線網兩種數據類型定義清楚,時序和組合電路描述簡潔,能幫助快速了解硬件設計的基本概念。
但VHDL和Verilog各有所長,并無優劣之分,最重要的是建模方法與思想
推薦初學者:從Verilog學起
Verilog和C語言:
區別:
互連(connectivity):wire型變量配合驅動結構可有效表示網線互連
并發(concurrency):并行執行
時間(time):Verilog定義了絕對和相對的時間度量,仿真時可描述信號之間的時間關系
HDL語言與軟件語言(C,C++等)有本質區別,評判HDL代碼的最終標準是實現的硬件電路的性能(面積和速度)
一個硬件設計的最終性能,很大程度上取決于設計工程師所構想的硬件實現方案的合理性
從軟件設計轉行的初學者,片面追求代碼的整潔、簡短是錯誤的,是與評價HDL的標準背道而馳的
正確的方法是,首先對所要實現的硬件電路有一個清楚的認識,對硬件結構與連接了解十分清楚,再用HDL語句描述出來
驗證時,常用C語言編寫測試向量,與Verilog在仿真器中通信,用于驗證
描述分級
系統級:對系統整體功能和性能指標進行衡量
功能級:將系統功能劃分為可實現的具體功能模塊,大致確定模塊間的接口,描述每個模塊的時序約束
行為級:明確每個模塊所有的接口和邊界,模塊內部功能,外部接口和行為都已經清晰。常用于編寫仿真測試激勵(延時描述、監視描述)
寄存器傳輸級:不關注寄存器和組合邏輯的細節,使用HDL語言描述寄存器到寄存器間的邏輯功能描述電路——一般對此設計仿真
門級:目前要直接使用門級描述的情況一般是ASIC和FPGA設計中有面積或時序要求較高的模塊
布局規劃與布局布線:門級描述映射到目標器件中
時序仿真:將布局布線的延時信息反標注到設計網表中進行仿真,簡稱后仿真。包含門延時和線延時,能較好反映芯片實際工作情況。主要目的是發現時序違規的情況
所有的電路單元是并行工作的,相互之間沒有順序關系,即使是最小的單元也是如此
模塊中只有定義了時鐘邊沿的行為是與跳變沿有關的,其余(例如+,-,×,÷,多路選擇器,譯碼器等)如果沒有定義邊沿觸發,就與邊沿無關,其輸出與輸入之間的延時只有門延時和線延時,線路越長,此延時越大
assign:連續賦值語句
#3:模擬組合邏輯的延時,表示經過3個延時單位,再進行賦值
timescale 1ns/100ps:定義時間單位/仿真時間精度
{}:是Verilog的合并符號,將多個變量合并成一個組合變量,可用于批量賦值
xor:是Verilog自帶的邏輯門原語
實例化:調用功能模塊
在模塊中實例化其他模塊的描述方式稱為結構化描述
Verilog的3種描述方法:
數據流描述:assign語句——連續賦值語句
行為描述:always或initial語句——其中包含的語句稱為過程賦值語句
結構化描述:實例化已有的模塊(包括Module實例化、門實例化、用戶定義原語UDP實例化)
基本詞法:
Verilog對大小寫敏感,書寫時要格外注意
Verilog中所有關鍵字都是小寫
Verilog中標識符(內部信號名,變量名)由字母、數字、$、和_組成,第一個字符必須是字母或_
//和/* */表示注釋,某些控制編譯過程的指令也是以注釋的形式出現,例如/* synthesis syn_black_box */
間隔:空格、制表符、換行符
轉義字符:\n換行符;\t制表符;\\表示\本身
模塊和端口:
Verilog中,module是基本的組成單元
建議在一個Verilog文件中只放一個module定義,且使文件名與module名稱一致
module模塊名稱(端口列表)
//變量聲明
input [1:0], output, inout,
reg, wire, parameter,
function, task, …
//語句,以下語句在module中是并行的關系,無任何順序關系,其文本上的順序不改變module的功能
initial
always
module實例化
門實例化
UDP實例化
assign
endmodule
有些module不包含輸入輸出端口,一般用于內部已經實例化了激勵的封閉系統,只用于仿真,不用于實際系統
input默認為wire類型(貌似不可以聲明為reg類型);output在always或initial中賦值時默認是reg,否則是wire;inout一般設為tri類型(表示有多個驅動源,如無驅動則為三態)
建議將所有的聲明放到所有語句之前,增加可讀性
always的用法
1.always@后面內容是敏感變量,always@(*)里面的敏感變量為*,意思是說敏感變量由綜合器根據always里面的輸入變量自動添加,不用自己考慮。
2.如果沒有@,那就是不會滿足特定條件才執行,而是執行完一次后立馬執行下一次,一直重復執行
3.通常情況下,使用方法是:always@(posedge clk_out_0, negedge reset_n)
Error (10028): Can't resolve multiple constant drivers for net……
上面的代碼在quartusII里面就會出現題目的錯誤提示,其原因就是在兩個always語句里面都對out1,out2信號賦值了,而兩個always是并行快,所以提示出現多重驅動的情況
解決辦法:將兩個always合并成一個
結構化描述
結構化描述就是在設計中實例化已有的功能模塊,包括門原語、用戶自定義原語UDP,和其他模塊module
需要將模塊實例與外部信號相連接,模塊實例的端口連接規則:
Input:缺省為線網wire類型
Output:寄存器(在過程賦值語句中被賦值),或者是線網類型
Inout:缺省為線網類型,定義為tri雙向
與之相連的信號類型為:
與input相連的,可以使一個線網或寄存器
與output,相連的一定是驅動一個線網
與inout先練,輸入時從一個線網驅動而來,輸出時驅動到一個線網(切記,只有線網類型可以驅動inout端口,否則編譯出錯)
實例的端口對應方式有兩種:
(1)名稱對應:外部信號與模塊端口名稱相對應,順序可隨意
模塊名 實例名稱(
.X(E_X),
.Y(E_Y),????//沒有可留空
……
);
(2)位置對應:按順序對應(與函數傳遞參數類似),沒有則留空
模塊名 實例名稱(E_X, E_Y, E_SUM, E_C_out);
參數化
上面講了實例化,這里講參數化
module中的參數一般用作定義常量
當實例化某個模塊時,可以修改參數的值,實現不同的特性,是通過"新參數直接代入"或"參數重定義"來完成的。
方法:
1、defparam關鍵字重新定義模塊參數——Altera自動生成的通用模塊定制采用
此方法在某些綜合器中失效(應采用第2種)
defparam
module.parameter = ,
……
2、直接在實例化時代入參數——Xilinx自動生成的通用模塊定制采用
#(……,……,……)參數要按順序列出,不能遺漏和顛倒
總結
以上是生活随笔為你收集整理的hdl语言哪种语言类似c,Verilog HDL笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六级分数分布
- 下一篇: 几种常用数据库分页查询