verilog學習--1、語言要素

先看一個例子

/*This is first Verilog progaram*/
·timescale 1ns/1ns
module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry;
/**/assign #2 Sum=A^B;assign #5 Carry=A&B;
endmodule; 

Verilog以module為單位編寫,每個文件一個module,文件名與module名相同

  • 第1行為注釋;
  • 第2行為編譯指令;
  • 第3行為模塊聲明開始,模塊的名稱為halfAdder,模塊有4個端口;
  • 第4、5行對端口的類型進行了聲明;
  • 第6、7、8對模塊的行為進行了描述(或定義或設計);
  • 第9行聲明模塊結束

一個模塊的基本語法如下:

module module_name (port_list);Declarations:reg, wire, parameter,input, output, inout,function, task, . . .Statements:Initial statementAlways statementModule instantiationGate instantiationUDP instantiationContinuous assignment
endmodule

    這些語句在模塊中出現的順序無關緊要,這些語句是并發的。

    1.注釋:

    有兩種形式---與C語言相同

    /*第一種形式:可以擴展至多行 */
    //第二種形式:在本行結束。

    2.編譯指令

    `(反引號)開始的某些標識符是編譯器指令。在 Verilog 語言編譯時,特定的編譯器指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其它的不同編譯程序指令。

    完整的標準編譯器指令如下 :
    ? `define, `undef
    ? `ifdef, `else, `endif
    ? `default_nettype
    ? `include
    ? `resetall
    ? `timescale
    ? `unconnected_drive, `nounconnected_drive
    ? `celldefine, `endcelldefine

    2.1`define 和`undef

    `define指令用于文本替換,它很像 C語言中的#define 指令

    2.2 `ifdef, `else, `endif

    這些編譯指令用于條件編譯

    2.3`default_nettype

    該指令用于為隱式線網指定線網類型。也就是將那些沒有被說明的連線定義線網類型。
    `default_nettype wand
    該實例定義的缺省的線網為線與類型。因此,如果在此指令后面的任何模塊中沒有說明的連線,那么該線網被假定為線與類型。

    2.4`include

    `include 編譯器指令用于嵌入內嵌文件的內容。

    2.5?`resetall

    該編譯器指令將所有的編譯指令重新設置為缺省值。

    2.6 `timescale

    在Verilog HDL 模型中,所有時延都用單位時間表述。

    2.7 `unconnected_drive和`nounconnected_drive

    在模塊實例化中,出現在這兩個編譯器指令間的任何未連接的輸入端口或者為正偏電路狀態或者為反偏電路狀態。
    `unconnected_drive pull1
    . . .
    /*在這兩個程序指令間的所有未連接的輸入端口為正偏電路狀態(連接到高電平) */
    `nounconnected_drive
    `unconnected_drive pull0
    . . .
    /*在這兩個程序指令間的所有未連接的輸入端口為反偏電路狀態(連接到低電平) */
    `nounconnected_drive

    2.8 `celldefine 和 `endcelldefine

    這兩個程序指令用于將模塊標記為單元模塊。它們表示包含模塊定義,如下例所示。
    `celldefine
    module FD1S3AX (D, CK, Z) ;
    . . .
    endmodule
    `endcelldefine
    某些PLI例程使用單元模塊。

    3.常量

    3.1基本型:4種

    0、1、x、z

    3.2數值型:整型和實型

    3.2.1 整型

    兩種表示方法:

    1.簡單的十進制格式

    2.基數格式

    這種形式的整數格式為:
    [size ] 'base value

    s i z e 定義以位計的常量的位長; b a s e為o或O(表示八進制),b或B(表示二進制),d或D(表示十進制),h或H(表示十六進制)之一; v a l u e是基于 b a s e的值的數字序列。值 x和z以及十六進制中的 a到f不區分大小寫。

    • 基數格式計數形式的數通常為無符號數。
    • 如果沒有定義一個整數型的長度,數的長度為相應值中定義的位數。
    • 如果定義的長度比為常量指定的長度長,通常在左邊填 0補位。但是如果數最左邊一位為x或z,就相應地用x或z在左邊補位。
    • 如果長度定義得更小,那么最左邊的位相應地被截斷。
    • ?字符在數中可以代替值z在值z被解釋為不分大小寫的情況下提高可讀性

    3.2.2 實型

    兩種表示方法:

    1.簡單的十進制格式

    2.科學計數法

    Ve r i l o g語言定義了實數如何隱式地轉換為整數。實數通過四舍五入被轉換為最相近的整
    數。

    3.3字符串型

    字符串是雙引號內的字符序列。字符串不能分成多行書寫。

    5.變量

    5.1.標識符

    Verilog HDL中的標識符(identifier)可以是任意一組字母、數字、 $符號和_(下劃線)符號的
    組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。

    *轉義標識符:

    轉義標識符以 \(反斜線 )符號開頭,以空白結尾(空白可以是一個空格、一個制表字符或換行符)。

    *關鍵字:

    Verilog HDL 定義的一系列保留字,注意只有小寫的關鍵字才是保留字。

    5.2變量的類型

    2類:net 和 register

    5.2.1 線網類型net type

    具體又分為6大類11種

    net type 表示Verilog結構化元件間的物理連線。它的值由驅動元件的值決定,例如連續賦值或門的輸出。如果沒有驅動元件連接到線網,線網的缺省值為 z。

    簡單的線網類型說明語法為:
    net_kind [msb:lsb] net1, net2, . . . , netN;
    n e t _ k i n d 是上述線網類型的一種。 m s b和l s b 是用于定義線網范圍的常量表達式;范圍定義是可選的;如果沒有定義范圍,缺省的線網類型為 1位。

    • 1.wire和tri

    • 2.wand和triand

    • 3.wor和trior

    • 4.trireg

    • 5.tri0和tri1

    • 6.supply0和supply1

    supply0用于對“地”建模,即低電平 0;s u p p l y 1網用于對電源建模,即高電平 1;例如:
    supply0 Gnd, ClkGnd;
    supply1 [2:0] Vcc;

    5.2.2 寄存器類型 register type

    具體有5種:reg、integer、time、real、realtime

    • 1.reg寄存器類

    register type表示一個抽象的數據存儲單元,它只能在 always語句和initial語句中被賦值,并且它的值從一個賦值到另一個賦值被保存下來。寄存器類型的變量具有 x的缺省值。

    寄存器數據類型 reg是最常見的數據類型。 reg類型使用保留字 reg加以說明,形式如下:
    reg
    [ msb: lsb] reg1, reg2, . . . regN;

    • 2存儲器類型:

    存儲器是一個寄存器數組。存儲器使用如下方式說明:

    reg [ msb: lsb] memory1[ upper1: lower1], memory2[ upper2: lower2], . . . ;

    • 3.integer整數寄存器類

    • 4.time類

    • 5.real和realtime類

    6.參數

    參數是一個常量。參數經常用于定義時延和變量的寬度。使用參數說明的參數只被賦值一次。參數說明形式如下:
    parameter param1 = const_expr1, param2 = const_expr2, ...,paramN = const_exprN;

    7.行為描述方式

    7.1數據流描述

    用數據流描述方式對一個設計建模的最基本的機制就是使用連續賦值語句。在連續賦值語句中,某個值被指派給線網變量。 連續賦值語句的語法為 :
    assign [delay] LHS_net = RHS_ expression;

    7.2行為描述方式

    設計的行為功能使用下述過程語句結構描述:
    1) initial語句:此語句只執行一次。

    2) always語句:此語句總是循環執行 , 或者說此語句重復執行

    只有寄存器類型數據能夠在這兩種語句中被賦值。寄存器類型數據在被賦新值前保持原
    有值不變。所有的初始化語句和 always語句在0時刻并發執行。

    7.3結構化模式方式

    在Verilog HDL中可使用如下方式描述結構 :
    1) 內置門原語 (在門級);
    2) 開關級原語 (在晶體管級 );
    3) 用戶定義的原語 (在門級);
    4) 模塊實例 (創建層次結構)。
    通過使用線網來相互連接。

    7.4混合描述方式

    在模塊中,結構的和行為的結構可以自由混合。也就是說,模塊描述中可以包含實例化的門、模塊實例化語句、連續賦值語句以及 a l w a y s語句和 i n i t i a l語句的混合。它們之間可以相互包含。來自 a l w a y s語句和 i n i t i a l語句(切記只有寄存器類型數據可以在這兩種語句中賦值)的值能夠驅動門或開關,而來自于門或連續賦值語句(只能驅動線網)的值能夠反過來用于觸發always語句和initial語句。
    ?

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/pingmian/76158.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76158.shtml
    英文地址,請注明出處:http://en.pswp.cn/pingmian/76158.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    AC 自動機 洛谷P3808 P3796 P5357

    洛谷P3808 #include <bits/stdc.h> using namespace std; const int maxn 1e6 5; int ch[maxn][30], fa[maxn], End[maxn]; int cnt 0 , n; int get_num(char c){return c - a;} void build(string s){int cur 0, len s.length();for(int i 0; i < len; i){int…

    C++藍橋杯實訓篇(二)

    片頭 嗨咯~小伙伴們&#xff01;今天我們來一起學習算法和貪心思維&#xff0c;準備好了嗎&#xff1f;咱們開始咯&#xff01; 第1題 數位排序 對于這道題&#xff0c;我們需要自己寫一個排序算法&#xff0c;也就是自定義排序&#xff0c;按照數位從小到大進行排序。 舉一…

    redisson常用加鎖方式

    RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);這兩種加鎖方式的區別如下&…

    Go 微服務框架 | 路由實現

    文章目錄 不用框架實現web接口實現簡單的路由實現分組路由支持不同的請求方式支持同一個路徑的不同請求方式前綴樹應用前綴樹完善路由代碼 不用框架實現web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

    zabbix中通過模板實現自動發現對tcp端口批量監控

    主要為了解決監控大量端口&#xff0c;避免繁瑣的重復操作監控項和觸發器 諸位~ 僅供參考哈 自動發現監控參考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先創建一個模板 自定義名稱和群組 創建自動發現規則 模板——自動發現——創建發現規則…

    Mysql備忘記錄

    1、簡介 Mysql操作經常忘記命令&#xff0c;本文將持續記錄Mysql一些常用操作。 2、常見問題 2.1、忘記密碼 # 1、首先停止Mysql服務 systemctl stop mysqld # windows 從任務管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

    【藍橋杯】15屆JAVA研究生組F回文字符串

    一、思路 1.這題去年考的時候想的是使用全排列進行嘗試&#xff0c;實際不用這么麻煩&#xff0c;只用找到第一個和最后一個非特殊字符串的位置&#xff0c;然后分別向內檢查是否對稱&#xff0c;向外檢查是否對稱直到左指針小于0(可以通過添加使其對稱) 2.至于如何找到第一個…

    X 進制減法

    題目鏈接&#xff1a; 思路&#xff1a; X進制數321怎么轉換為十進制數為65&#xff1f;如下圖&#xff1a; ①題目要求我們求 A - B 的最小值&#xff0c;對第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;當進制越小的時候差值越小&#xff0c;但進制要比 max&…

    java線程安全-單例模式-線程通信

    首先看看單例模式的寫法 首先我們先來回顧一下餓漢式單例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

    大數據技術之SPARK

    Spark Core 什么是 RDD 代碼中是一個抽象類&#xff0c;它代表一個彈性的、不可變、可分區、里面的元素可并行計算的集合 彈性 存儲的彈性&#xff1a;內存與磁盤的自動切換&#xff1b; 容錯的彈性&#xff1a;數據丟失可以自動恢復&#xff1b; 計算的彈性&#xff1a;…

    Go 語言范圍 (Range)

    Go 語言范圍 (Range) Go 語言是一種靜態強類型、編譯型、并發型編程語言&#xff0c;由 Google 開發。它的簡潔性和高效性使其成為眾多開發者的首選。在 Go 語言中&#xff0c;range 是一個非常有用的關鍵字&#xff0c;用于遍歷數組、切片、字符串以及通道&#xff08;channe…

    VUE中數據綁定之OptionAPI

    <template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…

    react動態路由

    框架的權限控制&#xff08;在config.ts中配置&#xff09; export default {access: {}, }; 權限配置文件&#xff08;access.ts&#xff09; 新建 src/access.ts &#xff0c;在該文件中 export default 一個函數&#xff0c;定義用戶擁有的權限 該文件需要返回一個 functi…

    Android里面如何優化xml布局

    在 Android 開發中&#xff0c;以下是系統化的優化方案&#xff0c;從基礎到高級分層解析&#xff1a; 一、基礎優化策略 1. 減少布局層級 問題&#xff1a;每增加一層布局&#xff0c;測量/布局時間增加 1-2ms 解決方案&#xff1a; <!-- 避免嵌套 --> <LinearLayo…

    基于STM32、HAL庫的IP6525S快充協議芯片簡介及驅動程序設計

    一、簡介: IP6525S是一款高性能的同步降壓DC-DC轉換器芯片,具有以下特點: 輸入電壓范圍:4.5V至32V 輸出電壓范圍:0.8V至30V 最大輸出電流:5A 效率高達95% 可編程開關頻率(100kHz-1MHz) 支持PWM和PFM模式 內置過流保護、過溫保護等功能 該芯片常用于工業控制、通信設備…

    二分算法的入門筆記

    二分查找 使用前提&#xff1a;有序。可理解為枚舉的一種技巧。時間復雜度&#xff1a; l o g ( n ) log(n) log(n) 基礎模版代碼 使用時根據情景進行相應的變化。注意跳出條件and分支處理方式and返回答案&#xff0c;三者之間的配合&#xff0c;不要進入死循環。可以在模擬…

    輕量級Java跨包調用(完全解耦)

    Java函數式命令模式 輕量級跨包調用解耦方案&#xff0c;讓跨包調用就像調用本地接口那樣簡單。適用與具有公共依賴的兩個jar包&#xff0c;但是又不想相互引入對方作為依賴。 函數式命令模式&#xff0c;很好地實現了跨包調用解耦的目標&#xff0c;并且通過泛型JSON動態轉換保…

    離散數學問題集--問題5.9

    問題 5.9 綜合了計算機組成原理、數字邏輯和離散數學中的關鍵概念&#xff0c;旨在幫助學生理解二進制算術運算的硬件實現、邏輯門與算術運算的關系&#xff0c;以及如何使用數學方法來驗證數字系統的正確性。它強調了從規范到實現再到驗證的完整過程。 思想 函數抽象&#xf…

    OpenLayers:海量圖形渲染之矢量切片

    最近由于在工作中涉及到了海量圖形渲染的問題&#xff0c;因此我開始研究相關的解決方案。在咨詢了許多朋友之后發現矢量切片似乎是行業內最常用的一種解決方案&#xff0c;于是我便開始研究它該如何使用。 一、什么是矢量切片 矢量切片按照我的理解就是用柵格切片的方式把矢…

    神經網絡入門—自定義網絡

    網絡模型 定義一個兩層網絡 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F# 定義神經網絡模型 class Net(nn.Module):def __init__(self, init_x0.0):super().__init__()self.fc1 nn.Linear(1, 10)self.fc2 nn.Linear(…