天天看點

Verilog初級教程(14)Verilog中的指派語句

前言

正文

合理的左值

過程性指派(procedural assignment)

連續指派

過程連續性指派

往期回顧

何為指派語句?即将值放到線網或者變量上,這種操作稱為指派,英文:assignment.

它有三種基本形式:

過程性指派

過程連續指派

一個指派語句有兩個部分–右值(rhs)和左值(lhs),中間有一個相等的符号(=)或一個小于相等的符号(<=)。

下一節博文将看到,<code>=</code>為阻塞指派,<code>&lt;=</code>為非阻塞指派。

在過程性指派中,合理的左值應該是:

變量(矢量/标量)

向量reg、integer或time變量的<code>位選擇</code>或<code>部分選擇</code>。

存儲器(memory word)

上述任何一項的合并

過程指派通常發生在塊語句中,例如initial塊,always塊,還有task以及function中。

連續性指派中,合理的左值應該為:

線網(矢量/标量)

矢量線網的位選擇或部分選擇。

位選擇和部分選擇的合并

連續性指派通常發生在assign中。

過程連續性指派:

線網或者變量(向量/标量)

線網向量的位選擇或者部分選擇

rhs可以包含任何計算為最終值的表達式,而lhs表示一個線網或一個變量,rhs中的值被指派給它。

例如:

過程性指派發生在過程(procedures)中,如always、initial、task和函數中,用于将值放到變量上。變量将保持該值,直到下一次對同一變量的指派。

當仿真在仿真時間内的某一時刻執行該語句時,該值将被放到變量上。這可以通過使用控制流語句,如if-else-if、case語句和循環機制來控制和修改我們想要的方式。

變量聲明指派

一個初始值可以在變量聲明時被放置到變量上,如下圖所示。這個指派沒有持續時間,并且在下一次對同一變量的指派發生之前保持這個值。

<code>注意,不允許将變量聲明指派用給數組。</code>

如果變量在聲明過程中和initial塊中的時間0被初始化,如下例所示,則不保證指派順序,是以變量值可以有8’h05或8’hee。

這種方式是不推薦的,正常人是不會這麼做的。

這用于将值配置設定到标量線網和矢量線網上,隻要rhs發生變化就會發生。它提供了一種不需要指定門的互連就能建立組合邏輯模型的方法,并使其更容易用邏輯表達式來驅動線網。

每當b或c的值發生變化時,rhs中的整個表達式将被計算,a将被更新為新的值。

注意:我們仍然可以線上網聲明的時候進行連續指派,例如:

但我們必須謹慎使用,因為一個網隻能聲明一次,是以一個網隻能有一次聲明指派。

也就是說,一旦我們在聲明wire變量的時候進行了連續指派,後面則不能再次連續指派,否則就是多驅動。

這種指派類型貌似很少聽過,但卻是存在。

有兩種類型:

<code>assign ... deassign</code>

<code>force ... release</code>

assign … deassign

這将覆寫變量的所有過程性指派,并通過使用與deassign相同的信号來停用。變量的值将保持不變,直到變量通過過程化或過程化連續指派獲得新的值。指派語句的lhs不能是位選擇、部分選擇或數組引用,但可以是一個變量或變量的連接配接。

為了測試,我仿真了一下,仿真檔案:

按照文法描述,應該是前20ns都保持為assign指派0,之後為1;

Verilog初級教程(14)Verilog中的指派語句

仿真結果顯示也為如此。

force…release

這些語句與assign… deassign語句類似,但也可以應用于網和變量。lhs可以是網的位選擇、網的部分選擇、變量或網,但不能是數組的引用和變量的位/部分選擇。force語句将覆寫所有其他對變量的指派,直到使用釋放關鍵字釋放它。

為了測試,我們設計如下仿真檔案:

現在對這段簡單的測試程式進行分析:

在一開始的時候,由于a和b的初始值都為1,又:

是以,o的值為1;

經過10ns,a和b的值被指派為0,是以o應該為0,但是此刻:

我們嘗試将o拉高;

同樣在過10ns:

我們再次嘗試将o拉低;

從如下仿真圖中可以看出均為成功。

Verilog初級教程(14)Verilog中的指派語句

這說明,在release之前,對變量o的所有操作都被忽視了。

繼續看,在release之後,我們對o的操作都是成功的:

Verilog初級教程(14)Verilog中的指派語句

verilog初級教程(13)verilog中的塊語句

verilog初級教程(12)verilog中的generate塊

verilog初級教程(11)verilog中的initial塊

verilog初級教程(10)verilog的always塊

verilog初級教程(9)verilog的運算符

verilog初級教程(8)verilog中的assign語句

verilog初級教程(7)verilog子產品例化以及懸空端口的處理

verilog初級教程(6)verilog子產品與端口

verilog初級教程(5)verilog中的多元數組和存儲器

verilog初級教程(4)verilog中的标量與向量

verilog初級教程(3)verilog 資料類型

verilog初級教程(2)verilog hdl的初級文法

verilog初級教程(1)認識 verilog hdl

晶片設計抽象層及其設計風格

verilog以及vhdl所倡導的的代碼準則

fpga/asic初學者應該學習verilog還是vhdl?

個人微信公衆号: fpga lab

交個朋友