z/(z-1) 如何用verilog表示

Verilog语言要素
> Verilog语言要素
Verilog语言要素
HDL 中的标识符 (identifier) 可以是任意一组字母、数字、 $ 符号和 _( 下划线 ) 符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下是标识符的几个例子: Count COUNT // 与 Count 不同。 _R1_D2 R56_68 FIVE$ 转义标识符 (escaped identifier ) 可以在一条标识符中包含任何可打印字符。转义标识符以
( 反斜线 ) 符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。下面例举了几个转义标识符: 7400 .*.$ {******} ~Q OutGate 与 OutGate 相同。 最后这个例子解释了在一条转义标识符中,反斜线和结束空格并不是转义标识符的一部分。也就是说,标识符 OutGate 和标识符 OutGate 恒等。
HDL 定义了一系列保留字,叫做关键词,它仅用于某些上下文中。 附录 A 列出了语言中的所有保留字。注意只有小写的关键词才是保留字。例如,标识符 always( 这是个关键词 ) 与标识符 ALWAYS( 非关键词 ) 是不同的。    另外,转义标识符与关键词并不完全相同。标识符 initial 与标识符 initial (这是个关键词)不同。注意这一约定与那些转义标识符不同。 注释    在
HDL 中有两种形式的注释。 /* 第一种形式 : 可以扩展至 多行 */ // 第二种形式 : 在本行结束。 格式 Verilog HDL 区分大小写。也就是说大小写不同的标识符是不同的。此外, Verilog HDL 是自由格式的,即结构可以跨越多行编写,也可以在一行内编写。白空(新行、制表符和空格)没有特殊意义。下面通过实例解释说明。 initial begin Top = 3' b001; #2 Top = 3' b011; end 和下面的指令一样 : initial begin Top = 3' b001; #2 Top = 3' b011; end 系统任务和函数    以 $ 字符开始的标识符表示系统任务或系统函数。任务提供了一种封装行为的机制。这种机制可在设计的不同部分被调用。任务可以返回 0 个或多个值。函数除只能返回一个值以外与任务相同。此外,函数在 0 时刻执行,即不允许延迟,而任务可以带有延迟。 $display (Hi, you have reached LT today); /* $display 系统任务在新的一行中显示。 */ $time // 该系统任务返回当前的模拟时间。    系统任务和系统函数在第 10 章中详细讲解。 编译指令    以 ` (反引号)开始的某些标识符是编译器指令。在 Verilog 语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令。完整的标准编译器指令如下 : * `define, `undef * `ifdef, `else, `endif * `default_nettype * `include * `resetall * `timescale * `unconnected_drive, `nounconnected_drive * `celldefine, `endcelldefine define 和 `undef `define 指令用于文本替换,它很像 C 语言中的 #define 指令,如 : `define MAX_BUS_SIZE 32 . . . reg [ `MAX_BUS_SIZE - 1:0 ] AddR 一旦 `define 指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的 `define 指令, MAX_BUS_SIZE 能被多个文件使用。 `undef 指令取消前面定义的宏。例如 : `define WORD 16 // 建立一个文本宏替代。 . . . wire [ `WORD : 1] B . . . `undef WORD // 在 `undef 编译指令后 , WORD 的宏定义不再有效 . ifdef 、 `else 和 `endif    这些编译指令用于条件编译,如下所示: `ifdef WINDOWS parameter WORD_SIZE = 16 `else parameter WORD_SIZE = 32 `endif    在编译过程中,如果已定义了名字为 WINDOWS 的文本宏,就选择第一种参数声明,否则选择第二种参数说明。 `else 程序指令对于 `ifdef 指令是可选的。 default_nettype    该指令用于为隐式线网指定线网类型。也就是将那些没有被说明的连线定义线网类型。 `default_nettype wand    该实例定义的缺省的线网为线与类型。因此,如果在此指令后面的任何模块中没有说明的连线,那么该线网被假定为线与类型。 include `include 编译器指令用于嵌入内嵌文件的内容。文件既可以用相对路径名定义,也可以用全路径名定义 , 例如 : `include
. . / . . /primitives.v    编译时,这一行由文件 &../../primitives.v& 的内容替代。 resetall    该编译器指令将所有的编译指令重新设置为缺省值。 `resetall 例如,该指令使得缺省连线类型为线网类型。 timescale    在 Verilog HDL 模型中,所有时延都用单位时间表述。使用 `timescale 编译器指令将时间单位与实际时间相关联。该指令用于定义时延的单位和时延精度。 `timescale 编译器指令格式为: `timescale time_unit / time_precision time_unit 和 time_precision 由值 1 、 10 、和 100 以及单位 s 、 ms 、 us 、 ns 、 ps 和 fs 组成。例如: `timescale 1ns/100ps 本文引用地址:表示时延单位为 1ns, 时延精度为 100ps 。 `timescale 编译器指令在模块说明外部出现 , 并且影响后面所有的时延值。例如 : `timescale 1ns/ 100ps module AndFunc (Z, A, B); output Z; input A, B; and # (5.22, 6.17 ) Al (Z, A, B); // 规定了上升及下降时延值。 endmodule    编译器指令定义时延以 ns 为单位,并且时延精度为 1/10 ns ( 100 ps )。因此,时延值 5.22 对应 5.2 ns, 时延 6.17 对应 6.2 ns 。如果用如下的 `timescale 程序指令代替上例中的编译器指令 , `timescale 10ns/1ns    那么 5.22 对应 52ns, 6.17 对应 62ns 。    在编译过程中, `timescale 指令影响这一编译器指令后面所有模块中的时延值,直至遇到另一个 `timescale 指令或 `resetall 指令。当一个设计中的多个模块带有自身的 `timescale 编译指令时将发生什么?在这种情况下,模拟器总是定位在所有模块的最小时延精度上,并且所有时延都相应地换算为最小时延精度。例如, `timescale 1ns/ 100ps module AndFunc (Z, A, B); output Z; input A, B; and # (5.22, 6.17 ) Al (Z, A, B); endmodule `timescale 10ns/ 1ns module TB; reg PutA, PutB; wire GetO; initial begin PutA = 0; PutB = 0; #5.21 PutB = 1; #10.4 PutA = 1; #15 PutB = 0; end AndFunc AF1(GetO, PutA, PutB); endmodule    在这个例子中,每个模块都有自身的 `timescale 编译器指令。 `timescale 编译器指令第一次应用于时延。因此,在第一个模块中, 5.22 对应 5.2 ns, 6.17 对应 6.2 在第二个模块中 5.21 对应 52 ns, 10.4 对应 104 ns, 15 对应 150 ns 。如果仿真模块 TB ,设计中的所有模块最小时间精度为 100 ps 。因此,所有延迟(特别是模块 TB 中的延迟)将换算成精度为 100 ps 。延迟 52 ns 现在对应 520*100 ps , 104 对应
ps , 150 对应
ps 。更重要的是,仿真使用 100 ps 为时间精度。如果仿真模块 AndFunc ,由于模块 TB 不是模块 AddFunc 的子模块,模块 TB 中的 `timescale 程序指令将不再有效。 unconnected_drive 和 `nounconnected_drive    在模块实例化中,出现在这两个编译器指令间的任何未连接的输入端口或者为正偏电路状态或者为反偏电路状态。 `unconnected_drive pull1 . . . /* 在这两个程序指令间的所有未连接的输入端口为正偏电路状态(连接到高电平) */ `nounconnected_drive `unconnected_drive pull0 . . . /* 在这两个程序指令间的所有未连接的输入端口为反偏电路状态(连接到低电平) */ `nounconnected_drive celldefine 和 `endcelldefine 这两个程序指令用于将模块标记为单元模块。它们表示包含模块定义,如下例所示。 `celldefine module FD1S3AX (D, CK, Z) ; . . . endmodule `endcelldefine    某些 PLI 例程使用单元模块。 值集合 Verilog HDL 有下列四种基本的值: 1) 0 :逻辑 0 或 & 假 & 2) 1 :逻辑 1 或 & 真 & 3) x :未知 4) z :高阻    注意这四种值的解释都内置于语言中。如一个为 z 的值总是意味着高阻抗,一个为 0 的值通常是指逻辑 0 。 在门的输入或一个表达式中的为 &z& 的值通常解释成 &x& 。此外, x 值和 z 值都是不分大小写的,也就是说,值 0x1z 与值 0X1Z 相同。 Verilog HDL 中的常量是由以上这四类基本值组成的。 Verilog HDL 中有三类常量: 1) 整型 2) 实数型 3) 字符串型 下划线符号( _ )可以随意用在整数或实数中,它们就数量本身没有意义。它们能用来提高易读性;唯一的限制是下划线符号不能用作为首字符。 整型数    整型数可以按如下两种方式书写: 1) 简单的十进制数格式 2) 基数格式 1. 简单的十进制格式 这种形式的整数定义为带有一个可选的 &+& (一元)或 & - & (一元)操作符的数字序列。下面是这种简易十进制形式整数的例子。 32 十进制数 32 - 15 十进制数- 15 这种形式的整数值代表一个有符号的数。负数可使用两种补码形式表示。因此 32 在 5 位的二进制形式中为 10000 ,在 6 位二进制形式中为 110001 ;- 15 在 5 位二进制形式中为 10001 ,在 6 位二进制形式中为 110001 。 2. 基数表示法 这种形式的整数格式为: [size ] 'base value size 定义以位计的常量的位长; base 为 o 或 O (表示八进制), b 或 B (表示二进制), d 或 D (表示十进制), h 或 H (表示十六进制)之一; value 是基于 base 的值的数字序列。值 x 和 z 以及十六进制中的 a 到 f 不区分大小写。 下面是一些具体实例: 5'O37 5 位八进制数 4'D2 4 位十进制数 4'B1x_01 4 位二进制数 7'Hx 7 位 x( 扩展的 x), 即 xxxxxxx 4'hZ 4 位 z( 扩展的 z) , 即 zzzz 4'd-4 非法:数值不能为负 8'h 2 A 在位长和字符之间 , 以及基数和数值之间允许出现空格 3'b001 非法 : ` 和基数 b 之间不允许出现空格 (2+3)'b10 非法 : 位长不能够为表达式 注意, x (或 z )在十六进制值中代表 4 位 x (或 z ),在八进制中代表 3 位 x (或 z ),在二进制中代表 1 位 x (或 z )。    基数格式计数形式的数通常为无符号数。这种形式的整型数的长度定义是可选的。如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子: 'o721 9 位八进制数 'hAF 8 位十六进制数 如果定义的长度比为常量指定的长度长,通常在左边填 0 补位。但是如果数最左边一位为 x 或 z ,就相应地用 x 或 z 在左边补位。例如: 10'b10 左边添 0 占位 ,
10'bx0x1 左边添 x 占位 ,xxxxxxx0x1 如果长度定义得更小,那么最左边的位相应地被截断。例如: 3'b 与 3'b011 相等 5'H0FFF 与 5'H1F 相等 ?字符在数中可以代替值 z 在值 z 被解释为不分大小写的情况下提高可读性(参见第 8 章)。 实数    实数可以用下列两种形式定义: 1) 十进制计数法;例如 2.0 5.678 11572.12 0.1 2. // 非法:小数点两侧必须有 1 位数字 2) 科学计数法; 这种形式的实数举例如下: 23_5.1e2 其值为 23510.0; 忽略下划线 3.6E2 360.0 (e 与 E 相同 ) 5E - 4 0.0005 Verilog 语言定义了实数如何隐式地转换为整数。实数通过四舍五入被转换为最相近的整数。 42.446 , 42.45 转换为整数 42 92.5, 92.699 转换为整数 93 - 15.62 转换为整数- 16 - 26.22 转换为整数- 26 字符串    字符串是双引号内的字符序列。字符串不能分成多行书写。例如 : INTERNAL ERROR REACHED - &HERE 用 8 位 ASCII 值表示的字符可看作是无符号整数。因此字符串是 8 位 ASCII 值的序列。为存储字符串 &INTERNAL ERROR& ,变量需要 8*14 位。 reg [1 : 8*14] M . . . Message = INTERNAL ERROR 反斜线 ( ) 用于对确定的特殊字符转义。 n 换行符 t 制表符 \ 字符
206 八进制数 206 对应的字符
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一(z-1)、用verilog表示,z&#47,谢老。_编程_探探数码问答网
(z-1)、用verilog表示,z&#47,谢老。
编辑: 探探数码问答网 &&&来源:用户发布&&&发布时间:&&&查看次数:24
(z-1)、这样如何形用verilog表示,z&笑呀#47,郁闷了。
【探讨解答】
verilog语言中assigny=e?a:1’assignb=(~e)?...
快考试了,这个不太明白。。。e为1,则y = a,否则y=高阻; e为0,则b = y,否则b=高阻;
verilog语言中怎么将一个32bit的数据每一位进行”或...
对于一个32bits的数据S[31:0],我想检测S是否为0,结果存入Z中。 一种方...简单: Z=|S ;
更多相关内容
本站内容来自网友发布,本站无法保证其部分内容的正确性,请用户一定仔细辨别。
[] &&[联系QQ:885&971&98] &
沪ICP备号&Verilog語言要素
& 您現在的位置:&&&&&&&&&Verilog語言要素
第三章 Verilog語言要素
本章介紹Verilog HDL的基本要素,包括標識符、註釋、數值、編譯程式指令、系統任務和系統函數。另外,本章還介紹了Verilog硬體描述語言中的兩種數據類型。
  Verilog HDL中的標識符(identifier)可以是任意一組字母、數字、$符號和_(下劃線)符號的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。以下是標識符的幾個例子:
COUNT //與Count不同。
  轉義標識符(escaped identifier )可以在一條標識符中包含任何可列印字符。轉義標識符以\
(反斜線)符號開頭,以空白結尾(空白可以是一個空格、一個製表字符或換行符)。下面例舉了幾個轉義標識符:
\OutGate 與OutGate相同。
  最後這個例子解釋了在一條轉義標識符中,反斜線和結束空格並不是轉義標識符的一部分。也就是説,標識符\OutGate
和標識符OutGate恒等。
  Verilog HDL定義了一系列保留字,叫做關鍵詞,它僅用於某些上下文中。 附錄A列出了語言中的所有保留字。注意只有小寫的關鍵詞才是保留字。例如,標識符always(這是個關鍵詞)與標識符ALWAYS(非關鍵詞)是不同的。
  另外,轉義標識符與關鍵詞並不完全相同。標識符\initial 與標識符initial(這是個關鍵詞)不同。注意這一約定與那些轉義標識符不同。
  在Verilog HDL中有兩種形式的註釋。
/*第一種形式:可以擴展至
//第二種形式:在本行結束。
  Verilog HDL區分大小寫。也就是説大小寫不同的標識符是不同的。此外,Verilog
HDL是自由格式的,即結構可以跨越多行編寫,也可以在一行內編寫。白空(新行、製表符和空格)沒有特殊意義。下面通過實例解釋説明。
initial begin Top = 3' b001; #2 Top = 3' b011; end
和下面的指令一樣:
Top = 3' b001;
#2 Top = 3' b011;
  系統任務和函數
  以$字符開始的標識符表示系統任務或系統函數。任務提供了一種封裝行為的機制。這種機制可在設計的不同部分被調用。任務可以返回0個或多個值。函數除只能返回一個值以外與任務相同。此外,函數在0時刻執行,即不允許延遲,而任務可以帶有延遲。
$display (&Hi, you have reached LT today&);
/* $display 系統任務在新的一行中顯示。*/
//該系統任務返回當前的模擬時間。
  系統任務和系統函數在第10章中詳細講解。
  編譯指令
 以`(反引號)開始的某些標識符是編譯器指令。在Verilog
語言編譯時,特定的編譯器指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其它的不同編譯程式指令。完整的標準編譯器指令如下:
* `define, `undef
* `ifdef, `else, `endif
* `default_nettype
* `include
* `resetall
* `timescale
* `unconnected_drive, `nounconnected_drive
* `celldefine, `endcelldefine
3.5.1 `define 和`undef
  `define指令用於文本替換,它很像C語言中的#define 指令,如:
`define MAX_BUS_SIZE 32
reg [ `MAX_BUS_SIZE - 1:0 ] AddR
一旦`define 指令被編譯,其在整個編譯過程中都有效。例如,通過另一個文件中的`define指令,MAX_BUS_SIZE
能被多個文件使用。
`undef 指令取消前面定義的宏。例如:
`define WORD 16 //建立一個文本宏替代。
wire [ `WORD : 1] B
`undef WORD
// 在`undef編譯指令後, WORD的宏定義不再有效.
3.5.2 `ifdef、`else 和`endif
  這些編譯指令用於條件編譯,如下所示:
`ifdef WINDOWS
parameter WORD_SIZE = 16
parameter WORD_SIZE = 32
  在編譯過程中,如果已定義了名字為WINDOWS的文本宏,就選擇第一種參數聲明,否則選擇第二種參數説明。
  `else 程式指令對於`ifdef 指令是可選的。
3.5.3 `default_nettype
  該指令用於為隱式線網指定線網類型。也就是將那些沒有被説明的連線定義線網類型。
`default_nettype wand
  該實例定義的預設的線網為線與類型。因此,如果在此指令後面的任何模組中沒有説明的連線,那麼該線網被假定為線與類型。
3.5.4 `include
  `include 編譯器指令用於嵌入內嵌文件的內容。文件既可以用相對路徑名定義,也可以用全路徑名定義,
`include & . . / . . /primitives.v&
  編譯時,這一行由文件“../../primitives.v” 的內容替代。
3.5.5 `resetall
  該編譯器指令將所有的編譯指令重新設置為預設值。
例如,該指令使得預設連線類型為線網類型。
3.5.6 `timescale
  在Verilog HDL 模型中,所有時延都用單位時間表述。使用`timescale編譯器指令將時間單位與實際時間相關聯。該指令用於定義時延的單位和時延精度。`timescale編譯器指令格式為:
`timescale time_unit / time_precision
time_unit 和time_precision 由值1、10、和100以及單位s、ms、us、ns、ps和fs組成。例如:
`timescale 1ns/100ps
表示時延單位為1ns, 時延精度為100ps。`timescale 編譯器指令在模組説明外部出現,
並且影響後面所有的時延值。例如:
`timescale 1ns/ 100ps
module AndFunc (Z, A, B);
input A, B;
and # (5.22, 6.17 ) Al (Z, A, B);
//規定了上升及下降時延值。
  編譯器指令定義時延以ns為單位,並且時延精度為1/10 ns(100 ps)。因此,時延值5.22對應5.2
ns, 時延6.17對應6.2 ns。如果用如下的`timescale程式指令代替上例中的編譯器指令,
`timescale 10ns/1ns
  那麼5.22對應52ns, 6.17對應62ns。
  在編譯過程中,`timescale指令影響這一編譯器指令後面所有模組中的時延值,直至遇到另一個`timescale指令或`resetall指令。當一個設計中的多個模組帶有自身的`timescale編譯指令時將發生什麼?在這種情況下,模擬器總是定位在所有模組的最小時延精度上,並且所有時延都相應地換算為最小時延精度。例如,
`timescale 1ns/ 100ps
module AndFunc (Z, A, B);
input A, B;
and # (5.22, 6.17 ) Al (Z, A, B);
`timescale 10ns/ 1ns
module TB;
reg PutA, PutB;
wire GetO;
#5.21 PutB = 1;
#10.4 PutA = 1;
#15 PutB = 0;
AndFunc AF1(GetO, PutA, PutB);
  在這個例子中,每個模組都有自身的`timescale編譯器指令。`timescale編譯器指令第一次應用於時延。因此,在第一個模組中,5.22對應5.2
ns, 6.17對應6.2 在第二個模組中5.21對應52 ns, 10.4對應104 ns, 15對應150 ns。如果倣真模組TB,設計中的所有模組最小時間精度為100
ps。因此,所有延遲(特別是模組TB中的延遲)將換算成精度為100 ps。延遲52 ns現在對應520*100 ps,104對應
ps,150對應 ps。更重要的是,倣真使用100 ps為時間精度。如果倣真模組AndFunc,由於模組TB不是模組AddFunc的子模組,模組TB中的`timescale程式指令將不再有效。
3.5.7 `unconnected_drive和`nounconnected_drive
  在模組實例化中,出現在這兩個編譯器指令間的任何未連接的輸入端口或者為正偏電路狀態或者為反偏電路狀態。
`unconnected_drive pull1
/*在這兩個程式指令間的所有未連接的輸入端口為正偏電路狀態(連接到高電平)*/
`nounconnected_drive
`unconnected_drive pull0
/*在這兩個程式指令間的所有未連接的輸入端口為反偏電路狀態(連接到低電平)*/
`nounconnected_drive
3.5.8 `celldefine 和 `endcelldefine
  這兩個程式指令用於將模組標記為單元模組。它們表示包含模組定義,如下例所示。
`celldefine
module FD1S3AX (D, CK, Z) ;
`endcelldefine
  某些PLI例程使用單元模組。
  值集合  
  Verilog HDL有下列四種基本的值:
  1) 0:邏輯0或“假”
  2) 1:邏輯1或“真”
  3) x:未知
  4) z:高阻
  注意這四種值的解釋都內置於語言中。如一個為z的值總是意味著高阻抗,一個為0的值通常是指邏輯0。
在門的輸入或一個運算式中的為“z”的值通常解釋成“x”。此外,x值和z值都是不分大小寫的,也就是説,值0x1z與值0X1Z相同。Verilog
HDL中的常量是由以上這四類基本值組成的。
  Verilog HDL中有三類常量:
  1) 整型
  2) 實數型
  3) 字符串型
下劃線符號(_)可以隨意用在整數或實數中,它們就數量本身沒有意義。它們能用來提高易讀性;唯一的限制是下劃線符號不能用作為首字符。
3.6.1 整型數
  整型數可以按如下兩種方式書寫:
  1) 簡單的十進位數格式
  2) 基數格式
1. 簡單的十進位格式
這種形式的整數定義為帶有一個可選的 “+”(一元)或 “-”(一元)操作符的數字序列。下面是這種簡易十進位形式整數的例子。
32 十進位數32
-15 十進位數-15
這種形式的整數值代表一個有符號的數。負數可使用兩種補數形式錶示。因此32在5位的二進位形式中為10000,在6位二進位形式中為110001;-15在5位二進位形式中為10001,在6位二進位形式中為110001。
2. 基數表示法
這種形式的整數格式為:
[size ] 'base value
size 定義以位計的常量的位長;base為o或O(表示八進制),b或B(表示二進位),d或D(表示十進位),h或H(表示十六進位)之一;value是基於base的值的數字序列。值x和z以及十六進位中的a到f不區分大小寫。
下面是一些具體實例:
5'O37 5位八進制數
4'D2 4位十進位數
4'B1x_01 4位二進位數
7'Hx 7位x(擴展的x), 即xxxxxxx
4'hZ 4位z(擴展的z) , 即zzzz
4'd-4 非法:數值不能為負
8'h 2 A 在位長和字符之間,以及基數和數值之間允許出現空格
3'b001 非法: ` 和基數b之間不允許出現空格
(2+3)'b10 非法:位長不能夠為運算式
注意,x(或z)在十六進位值中代表4位x(或z),在八進制中代表3位x(或z),在二進位中代表1位x(或z)。
  基數格式計數形式的數通常為無符號數。這種形式的整型數的長度定義是可選的。如果沒有定義一個整數型的長度,數的長度為相應值中定義的位數。下面是兩個例子:
'o721 9位八進制數
'hAF 8位十六進位數
如果定義的長度比為常量指定的長度長,通常在左邊填0補位。但是如果數最左邊一位為x或z,就相應地用x或z在左邊補位。例如:
10'b10 左邊添0佔位,
10'bx0x1 左邊添x佔位,xxxxxxx0x1
如果長度定義得更小,那麼最左邊的位相應地被截斷。例如:
3'b與3'b011 相等
5'H0FFF 與5'H1F 相等
?字符在數中可以代替值z在值z被解釋為不分大小寫的情況下提高可讀性(參見第8章)。
3.6.2 實數
  實數可以用下列兩種形式定義:
  1) 十進位計數法;例如
2. //非法:小數點兩側必須有1位數字
  2) 科學計數法; 這種形式的實數舉例如下:
23_5.1e2 其值為23510.0; 忽略下劃線
3.6E2 360.0 (e與E相同)
5E-4 0.0005
  Verilog語言定義了實數如何隱式地轉換為整數。實數通過四捨五入被轉換為最相近的整數。
42.446, 42.45 轉換為整數42
92.5, 92.699 轉換為整數93
-15.62 轉換為整數-16
-26.22 轉換為整數-26
3.6.3 字符串
  字符串是雙引號內的字符序列。字符串不能分成多行書寫。例如:
&INTERNAL ERROR&
&REACHED-&HERE&
用8位ASCII值表示的字符可看作是無符號整數。因此字符串是8位ASCII值的序列。為存儲字符串“INTERNAL
ERROR”,變數需要8*14位。
reg [1 : 8*14] M
Message = &INTERNAL ERROR&
反斜線 (\ ) 用於對確定的特殊字符轉義。
\\ 字符\本身
\206 八進制數206對應的字符
  數據類型
  Verilog HDL 有兩大類數據類型。
  1) 線網類型。net type 表示Verilog結構化元件間的物理連線。它的值由驅動元件的值決定,例如連續賦值或門的輸出。如果沒有驅動元件連接到線網,線網的預設值為z。
  2) 寄存器類型。register type表示一個抽象的數據存儲單元,它只能在always語句和initial語句中被賦值,並且它的值從一個賦值到另一個賦值被保存下來。寄存器類型的變數具有x
的預設值。
3.7.1 線網類型
  線網數據類型包含下述不同種類的線網子類型。
簡單的線網類型説明語法為:
net_kind [msb:lsb] net1, net2, . . . , netN;
net_kind 是上述線網類型的一種。msb和lsb 是用於定義線網範圍的常量運算式;範圍定義是可選的;如果沒有定義範圍,預設的線網類型為1位。下面是線網類型説明實例。
wire Rdy, S //2個1位的連線。
wand [2:0] A //Addr是3位線與。
當一個線網有多個驅動器時,即對一個線網有多個賦值時,不同的線網産生不同的行為。例如,
assign Rde = Blt & W
assign Rde = Kbl | K
本例中,Rde有兩個驅動源,分別來自於兩個連續賦值語句。由於它是線或線網,Rde的有效值由使用驅動源的值(右邊運算式的值)的線或(wor)表(參見後面線或網的有關章節)決定。
1. wire和tri線網
  用於連接單元的連線是最常見的線網類型。連線與三態線(tri)網語法和語義一致;三態線可以用於描述多個驅動源驅動同一根線的線網類型;並且沒有其他特殊的意義。
wire [3:2] Cla, Pla, S
tri [ MSB-1 : LSB +1] A
如果多個驅動源驅動一個連線(或三態線網),線網的有效值由下表決定。
wire (或 tri) 0 1 x z
下面是一個具體實例:
assign Cla = Pla & S
assign Cla = Pla ^ S
在這個實例中,Cla有兩個驅動源。兩個驅動源的值(右側運算式的值)用於在上表中索引,以便決定Cla的有效值。由於Cla是一個向量,每位的計算是相關的。例如,如果第一個右側運算式的值為01x,
並且第二個右測運算式的值為11z,那麼Cla 的有效值是x1x (第一位0和1在表中索引到x, 第二位1和1在表中索引到1,第三位x
和z在表中索引到x)。
2. wor和trior線網
  線或指如果某個驅動源為1,那麼線網的值也為1。線或和三態線或(trior)在語法和功能上是一致的。
wor [MSB:LSB] A
trior [MAX-1: MIN-1] Rdx, Sdx, B
如果多個驅動源驅動這類網,網的有效值由下表決定。
wor (或 trior) 0 1 x z
3. wand和triand線網
  線與(wand)網指如果某個驅動源為0,那麼線網的值為0。線與和三態線與(triand)網在語法和功能上是一致的。
wand [-7 : 0] D
triand Reset, C
如果這類線網存在多個驅動源,線網的有效值由下表決定。
wand (或 triand) 0 1 x z
4. trireg線網
  此線網存儲數值(類似于寄存器),並且用於電容節點的建模。當三態寄存器(trireg)的所有驅動源都處於高阻態,也就是説,值為z時,三態寄存器線網保存作用線上網上的最後一個值。此外,三態寄存器線網的預設初始值為x。
trireg [1:8] Dbus, A
5. tri0和tri1線網
  這類線網可用於線邏輯的建模,即線網有多於一個驅動源。tri0(tri1)線網的特徵是,若無驅動源驅動,它的值為0(tri1的值為1)。
tri0 [-3:3] GndB
tri1 [0:-5] OtBus, ItB
下表顯示在多個驅動源情況下tri0或tri1網的有效值。
tri0 (tri1) 0 1 x z
z 0 1 x 0(1)
6. supply0和supply1線網
  supply0用於對“地”建模,即低電平0;supply1網用於對電源建模,即高電平1;例如:
supply0 Gnd, ClkG
supply1 [2:0] V
3.7.2 未説明的線網
  在Verilog HDL中,有可能不必聲明某種線網類型。在這樣的情況下,預設線網類型為1位線網。
可以使用`default_nettype編譯器指令改變這一隱式線網説明方式。使用方法如下:
`default_nettype net_kind
例如,帶有下列編譯器指令:
`default_nettype wand
任何未被説明的網預設為1位線與網。
3.7.3 向量和標量線網
  在定義向量線網時可選用關鍵詞scalared 或vectored。如果一個線網定義時使用了關鍵詞vectored,
那麼就不允許位選擇和部分選擇該線網。換句話説,必須對線網整體賦值(位選擇和部分選擇在下一章中講解)。例如:
wire vectored [3:1] G
//不允許位選擇Grb[2]和部分選擇Grb [3:2]
wor scalared [4:0] B
//與wor [4:0] Best相同,允許位選擇Best [2]和部分選擇Best [3:1]。
如果沒有定義關鍵詞,預設值為標量。
3.7.4 寄存器類型
  有5種不同的寄存器類型。
* realtime
1. reg寄存器類型
  寄存器數據類型reg是最常見的數據類型。reg類型使用保留字reg加以説明,形式如下:
reg [ msb: lsb] reg1, reg2, . . . regN;
msb和lsb 定義了範圍,並且均為常數值運算式。範圍定義是可選的;如果沒有定義範圍,預設值為1位寄存器。例如:
reg [3:0] S //Sat為4 位寄存器。
reg C //1位寄存器。
reg [1:32] Kisp, Pisp, L
寄存器可以取任意長度。寄存器中的值通常被解釋為無符號數, 例如:
reg [1:4] C
Comb = -2; //Comb 的值為14(1110),1110是2的補數。
Comb = 5; //Comb的值為15(0101)。
  記憶體是一個寄存器數組。記憶體使用如下方式説明:
reg [ msb: 1sb] memory1 [ upper1: lower1],
memory2 [upper2: lower2],. . . ;
reg [0:3 ] MyMem [0:63]
//MyMem為64個4位寄存器的數組。
reg Bog [1:5]
//Bog為5個1位寄存器的數組。
MyMem和Bog都是記憶體。數組的維數不能大於2。注意記憶體屬於寄存器數組類型。線網數據類型沒有相應的記憶體類型。
  單個寄存器説明既能夠用於説明寄存器類型,也可以用於説明記憶體類型。
parameter ADDR_SIZE = 16 , WORD_SIZE = 8;
reg [1: WORD_SIZE] RamPar [ ADDR_SIZE-1 : 0], DataR
RamPar是記憶體,是16個8位寄存器數組,而DataReg是8位寄存器。
  在賦值語句中需要注意如下區別:記憶體賦值不能在一條賦值語句中完成,但是寄存器可以。因此在記憶體被賦值時,需要定義一個索引。下例説明它們之間的不同。
reg [1:5] D //Dig為5位寄存器。
Dig = 5'b11011;
  上述賦值都是正確的, 但下述賦值不正確:
reg BOg[1:5]; //Bog為5個1位寄存器的記憶體。
Bog = 5'b11011;
  有一種記憶體賦值的方法是分別對記憶體中的每個字賦值。例如:
reg [0:3] Xrom [1:4]
Xrom[1] = 4'hA;
Xrom[2] = 4'h8;
Xrom[3] = 4'hF;
Xrom[4] = 4'h2;
  為記憶體賦值的另一種方法是使用系統任務:
  1) $readmemb (載入二進位值)
  2) $readmemb (載入十六進位值)
  這些系統任務從指定的文本文件中讀取數據並載入到記憶體。文本文件必須包含相應的二進位或者十六進位數。例如:
reg [1:4] RomB [7:1] ;
$ readmemb (&ram.patt&, RomB);
Romb是記憶體。文件“ram.patt”必須包含二進位值。文件也可以包含空白空間和註釋。下面是文件中可能內容的實例。
  系統任務$readmemb促使從索引7即Romb最左邊的字索引,開始讀取值。如果只載入記憶體的一部分,值域可以在$readmemb方法中顯式定義。例如:
$readmemb (&ram.patt&, RomB, 5, 3);
在這種情況下只有Romb[5],Romb[4]和Romb[3]這些字從文件頭開始被讀取。被讀取的值為和1000。
文件可以包含顯式的地址形式。
@hex_address value
如下實例:
在這種情況下,值被讀入記憶體指定的地址。
  當只定義開始值時,連續讀取直至到達記憶體右端索引邊界。例如:
$readmemb (&rom.patt&, RomB, 6);
//從地址6開始,並且持續到1。
$readmemb ( &rom.patt&, RomB, 6, 4);
//從地址6讀到地址4。
3. Integer寄存器類型
  整數寄存器包含整數值。整數寄存器可以作為普通寄存器使用,典型應用為高層次行為建模。使用整數型説明形式如下:
integer integer1, integer2,. . . intergerN [msb:1sb]
msb和lsb是定義整數數組界限的常量運算式,數組界限的定義是可選的。注意容許無位界限的情況。一個整數最少容納32位。但是具體實現可提供更多的位。下面是整數説明的實例。
integer A, B, C; //三個整數型寄存器。
integer Hist [3:6]; //一組四個寄存器。
一個整數型寄存器可存儲有符號數,並且算術操作符提供2的補數運算結果。
整數不能作為位向量訪問。例如,對於上面的整數B的説明,B[6]和B[20:10]是非法的。一種截取位值的方法是將整數賦值給一般的reg類型變數,然後從中選取相應的位,如下所示:
reg [31:0] B
//Bint[6]和Bint[20:10]是不允許的。
/*現在,Breg[6]和Breg[20:10]是允許的,並且從整數Bint獲取相應的位值。*/
上例説明瞭如何通過簡單的賦值將整數轉換為位向量。類型轉換自動完成,不必使用特定的函數。從位向量到整數的轉換也可以通過賦值完成。例如:
integer J;
reg [3:0] B
J = 6; //J的值為32'b0000...00110。
Bcq = J; // Bcq的值為4'b0110。
Bcq = 4'b0101.
J = B //J的值為32'b0000...00101。
J = -6; //J 的值為 32'b1111...11010。
Bcq = J; //Bcq的值為4'b1010。
注意賦值總是從最右端的位向最左邊的位進行;任何多餘的位被截斷。如果你能夠回憶起整數是作為2的補數位向量表示的,就很容易理解類型轉換。
4. time類型
  time類型的寄存器用於存儲和處理時間。time類型的寄存器使用下述方式加以説明。
time time_id1, time_id2, . . . ,time_idN [ msb:1sb];
msb和lsb是表明範圍界限的常量運算式。如果未定義界限,每個標識符存儲一個至少64位的時間值。時間類型的寄存器只存儲無符號數。例如:
time Events [0:31]; //時間值數組。
time CurrT //CurrTime 存儲一個時間值。
5. real和realtime類型
  實數寄存器(或實數時間寄存器)使用如下方式説明:
//實數説明:
real real_reg1, real_reg2, . . ., real_regN;
//實數時間説明:
realtime realtime_reg1, realtime_reg2, . . . ,realtime_regN;
realtime與real類型完全相同。例如:
real Swing, T
realtime CurrT
real説明的變數的預設值為0。不允許對real聲明值域、位界限或字節界限。
  當將值x和z賦予real類型寄存器時,這些值作0處理。
RamCnt = 'b01x1Z;
RamCnt在賦值後的值為'b01010。
  參數是一個常量。參數經常用於定義時延和變數的寬度。使用參數説明的參數只被賦值一次。參數説明形式如下:
parameter param1 = const_expr1, param2 = const_expr2,
paramN = const_exprN;
下面為具體實例:
parameter LINELENGTH = 132, ALL_X_S = 16'
parameter BIT = 1, BYTE = 8, PI = 3.14;
parameter STROBE_DELAY = ( BYTE + BIT) / 2;
parameter TQ_FILE = & /home/bhasker/TEST/add.tq&;
參數值也可以在編譯時被改變。改變參數值可以使用參數定義語句或通過在模組初始化語句中定義參數值(這兩種機制將在第9章中詳細講解)。
1. 下列標識符哪些合法,哪些非法?
COunT, 1_2 Many, \**1, Real?, \wait, Initial
2. 系統任務和系統函數的第一個字符標識符是什麼?
3. 舉例説明文本替換編譯指令?
4. 在Verilog HDL中是否有布爾類型?
5. 下列運算式的位模式是什麼?
7'o44, 'Bx0, 5'bx110, 'hA0, 10'd2, 'hzF
6. 賦值後存儲在Qpr中的位模式是什麼?
reg [1:8*2] Q
Qpr = &ME& ;
7. 如果線網類型變數説明後未賦值,其預設值為多少?
8. Verilog HDL 允許沒有顯式説明的線網類型。如果是這樣,怎樣決定線網類型?
9. 下面的説明錯在哪?
integer [0:3] R
10. 編寫一個系統任務從資料檔案“memA.data”中載入32×64字記憶體。
11. 寫出在編譯時覆蓋參數值的兩種方法。

我要回帖

更多关于 z神 的文章

 

随机推荐