story · 2020年08月07日

IC验证系列之SV内建数据类型

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
未经作者同意,请勿转载!

推荐阅读

想了解更多内容,欢迎关注芯片数字实验室专栏
推荐阅读
关注数
12310
内容数
217
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息