差别
这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
数据类型 [2018/08/17 16:17] group001 创建 |
数据类型 [2018/08/17 17:02] group001 |
||
---|---|---|---|
行 1: | 行 1: | ||
Verilog中主要有两种数据类型:变量(veriable)和线网(net)。这两种数据类型主要区别在于它们 的赋值(assign)和保持(hold)方式,它们代表了不同的硬件结构。\\ | Verilog中主要有两种数据类型:变量(veriable)和线网(net)。这两种数据类型主要区别在于它们 的赋值(assign)和保持(hold)方式,它们代表了不同的硬件结构。\\ | ||
- | ====线网(net)==== | + | ====一、线网(net)==== |
线网(net)用于表示结构体(如逻辑门)之间的连接。除了trireg之外,所有其他的线网类型都不能保存值,线网的值时由driver决定的,例如由连续赋值驱动或由逻辑门驱动。如果driver没有驱动线网,那么线网的值是z,但是tri0、tri1、trireg除外,tri0将是0,tri1将是1,而trireg将保持之前driver驱动的值。\\ | 线网(net)用于表示结构体(如逻辑门)之间的连接。除了trireg之外,所有其他的线网类型都不能保存值,线网的值时由driver决定的,例如由连续赋值驱动或由逻辑门驱动。如果driver没有驱动线网,那么线网的值是z,但是tri0、tri1、trireg除外,tri0将是0,tri1将是1,而trireg将保持之前driver驱动的值。\\ | ||
线网有以下这些类型:wire、wand、wor、tri、triand、trior、tri0、tri1、trireg、uwire、supply0、supply1。 | 线网有以下这些类型:wire、wand、wor、tri、triand、trior、tri0、tri1、trireg、uwire、supply0、supply1。 | ||
------ | ------ | ||
- | ===wire和tri=== | + | ===1.1 wire和tri=== |
wire和tri是一样的,具有同样的语法和功能,提供两个名字是用于不同方面的建模:wire用于逻辑门的驱动或连续赋值的驱动,而tri用于多driver驱动。\\ | wire和tri是一样的,具有同样的语法和功能,提供两个名字是用于不同方面的建模:wire用于逻辑门的驱动或连续赋值的驱动,而tri用于多driver驱动。\\ | ||
当多个具有相同驱动强度的driver驱动同一个wire或tri线网出现逻辑冲突时,线网的值是x(unknown)。 | 当多个具有相同驱动强度的driver驱动同一个wire或tri线网出现逻辑冲突时,线网的值是x(unknown)。 | ||
------ | ------ | ||
- | ===wor、wand、trior、triand=== | + | ===1.2 wor、wand、trior、triand=== |
线逻辑(model wired logic)类型的线网有wor、wand、trior和triand,它们用于解决多个driver驱动同一个线网时出现的逻辑冲突。wor和trior实现线或(or)逻辑,wand和triand实现线与(and)逻辑。\\ | 线逻辑(model wired logic)类型的线网有wor、wand、trior和triand,它们用于解决多个driver驱动同一个线网时出现的逻辑冲突。wor和trior实现线或(or)逻辑,wand和triand实现线与(and)逻辑。\\ | ||
wor和trior是一样的,wand和triand是一样的,都是为了不同方面的建模。 | wor和trior是一样的,wand和triand是一样的,都是为了不同方面的建模。 | ||
------ | ------ | ||
- | ===tr0、tr1=== | + | ===1.3 tr0、tr1=== |
tri0用于表示带有下拉电阻(pulldown)的线网。当没有driver驱动tri0线网时,它的值是0,强度是pull。\\ | tri0用于表示带有下拉电阻(pulldown)的线网。当没有driver驱动tri0线网时,它的值是0,强度是pull。\\ | ||
tri1用于表示带有上拉电阻(pullup)的线网。当没有driver驱动tri1线网时,它的值是1,强度是pull。 | tri1用于表示带有上拉电阻(pullup)的线网。当没有driver驱动tri1线网时,它的值是1,强度是pull。 | ||
------ | ------ | ||
- | ===uwire=== | + | ===1.4 uwire=== |
Verilog-2005增加了uwire,只能被一个driver驱动,如果被多个driver驱动,那么编译时就会出错。但是不知为什么VCS现在还不支持uwire。 | Verilog-2005增加了uwire,只能被一个driver驱动,如果被多个driver驱动,那么编译时就会出错。但是不知为什么VCS现在还不支持uwire。 | ||
------ | ------ | ||
- | ===supply0、supply1=== | + | ===1.5 supply0、supply1=== |
supply0和supply1用于模型电源,就是只能提供0和1值的线网,通常只在Vendor提供的标准单元库中使用,平时不用。 | supply0和supply1用于模型电源,就是只能提供0和1值的线网,通常只在Vendor提供的标准单元库中使用,平时不用。 | ||
------ | ------ | ||
- | ===驱动强度=== | + | ===1.6 驱动强度=== |
线网驱动强度(drive strength)包括:\\ | 线网驱动强度(drive strength)包括:\\ | ||
-用于表示0的强度:highz0、supply0、strong0、pull0、weak0。 | -用于表示0的强度:highz0、supply0、strong0、pull0、weak0。 | ||
行 28: | 行 28: | ||
------ | ------ | ||
- | ===默认 net=== | + | ===1.7 默认 net=== |
在Verilog-1995中,由连续赋值驱动而且不是端口的1-bit线网必须声明,用于端口连接的1-bit线网可以不必声明。但是在Verilog-2001中,就去掉了这个限制。 | 在Verilog-1995中,由连续赋值驱动而且不是端口的1-bit线网必须声明,用于端口连接的1-bit线网可以不必声明。但是在Verilog-2001中,就去掉了这个限制。 | ||
- | ====变量(variable)==== | + | ====二、变量(variable)==== |
变量是数据存储单元的抽象。变量具有如下特性。\\ | 变量是数据存储单元的抽象。变量具有如下特性。\\ | ||
-变量将保持每次赋给它的值,直到下一次赋值给它。当过程块被触发时,过程块中的赋值就会改变变量的值。 | -变量将保持每次赋给它的值,直到下一次赋值给它。当过程块被触发时,过程块中的赋值就会改变变量的值。 | ||
行 44: | 行 44: | ||
time t = 64'habcd_efab_1234_5678; | time t = 64'habcd_efab_1234_5678; | ||
$display ("%x, %x", i[15:0], t[63:60]); | $display ("%x, %x", i[15:0], t[63:60]); | ||
+ | ====三、向量(vector)==== | ||
+ | 标量(scalar)是没有范围声明的1-bit的线网(net)或reg。\\ | ||
+ | 向量(vector)是带有范围声明的multi-bit的线网(net)或reg。 | ||
+ | 例子: | ||
+ | wand w; // a scalar net of type "wand" | ||
+ | wire w1, w2; // declares two wires | ||
+ | tri [15:0] busa; // a three-state 16-bit bus | ||
+ | reg a; // a scalar reg | ||
+ | reg [3:0] v; // a 4-bit vector reg made up of v[3], | ||
+ | // v[2], v[1], and v[0] | ||
+ | reg signed [3:0] signed_reg; // a 4-bit vector in range -8 to 7 | ||
+ | reg [4:-1] b; // a 6-bit vector reg | ||
+ | reg [4:0] x, y, z; // declares three 5-bit regs |