跳转至

数据类型&常量变量

数据类型:reg, wire, integer, parameter, large, medium, scalared, time, small, tri, trio, tril, triand, trior, trireg, vectored, wand, wor

常量

数字:

  1. 整数:b/B, d/D, h/H, o/O
    • 表达方式:
      1. <位宽><进制><数字>
      2. <进制><数字>:采用默认位宽(\(\geqslant32\)位)
      3. <数字>:采用默认进制(十进制)
    • 例:8b'10101100, 8'ha2
  2. x / z:x - 不定值,z - 高阻值(可写作?)
    • 例:4b10x0, 4b101z, 12'dz, 12'd?, 8'h4x
  3. 负数:在位宽前加负号
  4. 下划线:分开数的表达
    • 例:8'b0011_1010
  5. 字母:8位ASCII表示
    • 例:"AB"=16'B01000001_01000010

参数:符号常量

parameter 参数1 = 表达式, 参数2 = 表达式;

常用于定义==延迟时间==和变量宽度

通过参数传递改变被引用模块或实例中已定义的参数:

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型
  • 可以用做任何方程式的输入
    wire [n-1:0] 数据名1, 数据名2; // 每条线有n条线路
    wire [n:1] 数据名1, 数据名2;
    // <确定符><位宽><数据名>
    

reg:数据存储单元的抽象

  • 性质:可以通过赋值语句改变寄存器的值;默认初始值为不定值x
  • 常用来表示always模块内的指定信号,代表触发器;always模块内被复制的每一个信号都必须定义为reg型
  • reg数据可赋正负值,但作为表达式操作数时被当作无符号
  • 对reg数据的赋值相当于改变触发器存储单元的值;reg信号不一定时寄存器或触发器的输出,只表示被定义的信号将用在always模块内
    reg [n-1:0] 数据名1, 数据名2;
    reg [n:1] 数据名1, 数据名2;
    

memory:reg多维数组存在,通过扩展reg型数据的地址范围生成memory

reg [n-1:0] 存储器名 [m-1:0];
reg [n-1:0] 存储器名 [m:1]; // 可同时定义存储器型数据和reg型数据
其中reg[n-1:0]定义了存储器中每一个存储单元的大小(n位存储器),[m-1:0]定义了该存储器有多少个这样的寄存器(地址范围)

对存储器进行地址索引的表达式必须是常数表达式,其值可以取决于电路中其他的寄存器的值

一个完整的存储器无法在一条赋值语句中进行赋值,需指定该单元在存储器中的地址