Verilog-1995有两种基本数据类型:变量(reg)和线网(wire)。它们的值有4个状态:0,1,Z和X。这些变量可以用来存储组合逻辑值和时序逻辑值。
在整个仿真过程中,所有变量的存储都是静态的。线网用于连接设计的各个部分例如门级原语和模块实例化。
SystemVerilog中添加了许多新的数据类型,可以被硬件设计人员和验证人员同时使用。
逻辑类型
**Verilog中reg和wire的区别让总是让新手不知所措。**当驱动一个端口时,用哪个变量? 连接模块时,用哪个变量? SystemVerilog引入了logic数据类型,以便它可以作为一个变量,还可以进行连续赋值。
module logic_data_type(input logic rst_h);
parameter CYCLE = 20;
logic q, q_l, d, clk, rst_l;
initial begin
clk <= 0; // Procedural assignment
forever #(CYCLE/2) clk = ~clk;
end
assign rst_l = ~rst_h; // Continuous assignment
not n1(q_l, q); // q_l is driven by gate
my_dff d1(q, d, clk, rst_l); // d is driven by module
endmodule
但是,logic数据类型不能被多个变量驱动。例如在建模双向总线时,需要声明为线网类型wire。
Two-state类型变量
SystemVerilog引入了几种Two-state数据类型,以提高仿真性能并减少four-state类型变量的内存使用。最简单的数据类型是bit,它是无符号的。byte,shortint,int和longint是有符号数据类型:
bit b; // 2-state, single-bit
bit [31:0] b32; // 2-state, 32-bit unsigned integer
int i; // 2-state, 32-bit signed integer
byte b8; // 2-state, 8-bit signed integer
shortint s; // 2-state, 16-bit signed integer
longint l; // 2-state, 64-bit signed integer
如果你想用byte代替logic [7:0],需要注意的是一个byte变量数据范围是-128到+127,而不是0\~255。虽然可以使用byte unsigned,但这会让代码显得更冗长。
在验证时,如果不小心将Two-state变量连接到DUT的输出,并且DUT将X或Z值驱动到这些Two-state变量,这些值被转换为两态值。使用$ isunknown运算符,如果该检查位是X或Z,则返回1。
if ($isunknown(iport)
$display("@%0d: 4-state value detected on input port",
$time, iport);
本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/unZEe0JwPxjkwtXgB6GqBA
未经作者同意,请勿转载!
推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏