数据类型&常量变量
数据类型:reg, wire, integer, parameter, large, medium, scalared, time, small, tri, trio, tril, triand, trior, trireg, vectored, wand, wor
常量¶
数字:
- 整数:b/B, d/D, h/H, o/O
- 表达方式:
<位宽><进制><数字>
<进制><数字>
:采用默认位宽(\(\geqslant32\)位)<数字>
:采用默认进制(十进制)
- 例:
8b'10101100
,8'ha2
- 表达方式:
- x / z:x - 不定值,z - 高阻值(可写作?)
- 例:
4b10x0
,4b101z
,12'dz
,12'd?
,8'h4x
- 例:
- 负数:在位宽前加负号
- 下划线:分开数的表达
- 例:
8'b0011_1010
- 例:
- 字母:8位ASCII表示
- 例:
"AB"=16'B01000001_01000010
- 例:
参数:符号常量
常用于定义==延迟时间==和变量宽度
通过参数传递改变被引用模块或实例中已定义的参数:
module Decode(A, F);
parameter Width = 1, Polarity = 1;
endmodule
module Top;
wire [3:0] A4;
wire [4:0] A5;
wire [15:0] F16;
wire [31:0] F32;
Decode #(4:0) D1(A4, F16);
Decode #(5) D2(A5, F32);
endmodule
反标注:在一个模块中改变另一个模块的参数
module Test;
wire W;
Top T();
endmodule
module Top;
wire W;
Block B1();
Block B2();
endmodule
module Block;
parameter P = 0;
endmodule
module Annotate;
Test test();
defparam test.T.B1.P = 2, test.T.B2.P = 3; // 改变B1, B2中的参数值
endmodule
变量¶
wire:表示结构实体(如门)直接的物理连接
- 性质:不能存储门,必须受到驱动器(门或连续赋值语句)的驱动;无驱动时为高阻态z
- wire VS tri:wire用于单个门驱动或连续赋值语句的网络型数据,tri表示多驱动的网络型数据
- 多驱动情况下,逻辑值冲突将产生不确定值
wire/tri | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | z |
- 输入输出信号默认设定为wire型
- 可以用做任何方程式的输入
reg:数据存储单元的抽象
- 性质:可以通过赋值语句改变寄存器的值;默认初始值为不定值x
- 常用来表示always模块内的指定信号,代表触发器;always模块内被复制的每一个信号都必须定义为reg型
- reg数据可赋正负值,但作为表达式操作数时被当作无符号
- 对reg数据的赋值相当于改变触发器存储单元的值;reg信号不一定时寄存器或触发器的输出,只表示被定义的信号将用在always模块内
memory:reg多维数组存在,通过扩展reg型数据的地址范围生成memory
其中reg[n-1:0]
定义了存储器中每一个存储单元的大小(n位存储器),[m-1:0]
定义了该存储器有多少个这样的寄存器(地址范围)
对存储器进行地址索引的表达式必须是常数表达式,其值可以取决于电路中其他的寄存器的值
一个完整的存储器无法在一条赋值语句中进行赋值,需指定该单元在存储器中的地址