当前位置: 首页 > news >正文

SV基础(二):数据类型

文章目录

      • **1. Verilog 的 4 值数据类型**
        • **硬件建模的必要性**
      • **2. Testbench 中的问题**
        • **Verilog 的局限性**
      • **3. SystemVerilog 的 2 值数据类型**
        • **示例:明确的 2 值操作**
      • **4. 何时使用 2 值 vs 4 值**
      • **5. 关键优势**
      • **6. 注意事项**
      • 7. 有符号数与无符号数详解
        • **无符号数(Unsigned Number)**
        • **有符号数(Signed Number)**
      • 8. 四值数据类型列表(Verilog/SystemVerilog)
        • **关键说明**
      • 9. 实际应用注意事项
      • 10. 四值类型基础
      • 11. 四值数据类型详解
        • **2.1 `reg`**
        • **2.2 `wire`**
        • **2.3 `tri`**
        • **2.4 `logic`(SystemVerilog)**
        • **2.5 `integer`**
        • **2.6 `time`**
        • **2.7 `real`**
      • 12. 对比总结
      • 13. 关键注意事项
      • 14. 二值类型(2-State Data Types)
        • **3.1 `bit`**
        • **3.2 `byte`**
        • **3.3 `shortint`**
        • **3.4 `int`**
        • **3.5 `longint`**
      • 15. 数据类型转换
        • **4.1 静态转换(Static Cast)**
        • **4.2 动态转换(Dynamic Cast)**
      • 16. 枚举类型(Enum)
        • **5.1 基本定义**
        • **5.2 枚举函数**
      • 17. 字符串类型(String)
        • **6.1 基本操作**
        • **6.2 运算符**
        • **6.3 字符串函数**
      • 18. 关键注意事项

对比学习,影响会非常深刻!

在 Verilog 和 SystemVerilog 中,数据类型的值域存在显著差异。


1. Verilog 的 4 值数据类型

Verilog 最初是为 硬件建模 设计的语言,因此所有数据类型(如 regwireinteger)均为 4 值逻辑,可以表示:

  • 0:低电平(逻辑假)
  • 1:高电平(逻辑真)
  • X:未知值(未初始化或冲突驱动)
  • Z:高阻态(三态总线的悬空状态)

高阻态表示电路的输出端处于高阻抗状态,此时输出端既不主动输出高电平(如逻辑1)或低电平(逻辑0),也不会对连接的信号线产生明显的驱动能力。可以理解为输出端与电路内部“断开”,呈现类似“悬空”的状态。

硬件建模的必要性

在硬件中,信号可能因未初始化、多驱动冲突或三态总线等原因处于 XZ 状态。例如:

reg a = 1'bx;  // 初始化为未知值
wire b = (enable) ? data : 1'bz;  // 高阻态

2. Testbench 中的问题

测试平台(Testbench) 中,许多场景不需要 XZ 的语义。例如:

  • 激励生成:驱动到被测设计(DUT)的信号通常应为明确的 01
  • 功能检查:统计数据包数量时,计数器只需 01 的二进制运算。
  • 仿真效率:4 值逻辑的仿真开销较大,而测试平台代码可能更关注功能行为而非电气特性。
Verilog 的局限性

若在测试平台中使用 4 值类型(如 reg),可能引入意外行为:

reg [31:0] packet_count = 0;
packet_count = packet_count + 1'bx;  // 结果为 X(导致统计失效)

3. SystemVerilog 的 2 值数据类型

为了解决这一问题,SystemVerilog 引入了 2 值数据类型,仅支持 01

  • bit:单比特 2 值类型(等效于 logic 的 2 值版本)。
  • byteshortintintlongint:有符号整数类型(2 值)。
  • uint:无符号整数类型(2 值)。
示例:明确的 2 值操作
bit clk = 0;          // 只能是 0 或 1
int packet_count = 0; // 32 位有符号整数(2 值)

always #5 clk = ~clk; // 生成时钟

initial begin
  repeat(10) @(posedge clk);
  packet_count++;     // 明确递增,无需担心 X/Z
  $display("Packets: %d", packet_count);
end

4. 何时使用 2 值 vs 4 值

场景 推荐类型 原因
测试平台激励驱动 bitint 避免 X/Z 干扰,明确控制输入信号
计数器/循环控制 intuint 高效运算,无需处理未知状态
监测 DUT 输出 logicwire 需要检测 DUT 是否产生 X/Z(硬件行为)
三态总线建模 wiretri 必须支持 Z 状态

5. 关键优势

  1. 仿真性能优化:2 值数据类型的操作比 4 值更快。
  2. 代码简洁性:避免不必要的 X/Z 处理逻辑。
  3. 意图清晰:明确区分测试平台代码(功能验证)和设计代码(硬件行为)。

6. 注意事项

  • 类型转换:混合使用 2 值和 4 值类型时,SystemVerilog 会自动扩展值域(例如将 bit 赋值给 logic 时,高位补 0)。
  • 验证完备性:若需检测 DUT 的 X/Z 输出,仍需使用 4 值类型(如 logic)。

总结
SystemVerilog 的 2 值数据类型是面向 验证场景 的重要优化,通过减少无关状态(X/Z)的干扰,使测试平台代码更高效、更易维护。在实际项目中,应根据需求合理选择数据类型:

  • 测试平台:优先使用 bitint 等 2 值类型。
  • DUT 接口:使用 logicwire 以兼容硬件行为。

下面讲讲关于有符号数、无符号数四值数据类型的整理:


7. 有符号数与无符号数详解

无符号数(Unsigned Number)
  • 定义:仅表示非负整数,所有二进制位均用于数值计算。
  • 范围

  • 示例(3位无符号数)
    二进制 十进制值
    000 0
    001 1
    111 7

有符号数(Signed Number)
  • 定义:使用最高位作为符号位(0正1负),其余位表示数值,通常采用**补码(Two’s Complement)**表示。

  • 范围

相关文章:

  • C++ day6
  • 本地部署DeepSeek的硬件配置建议
  • 单目摄像头物体深度计算基础原理
  • SSL 证书是 SSL 协议实现安全通信的必要组成部分
  • js 判断数据是否为blob类型,blob数据转JSON和对象
  • selenium如何实现,开启浏览器的开发者工具模式,并且开启 toggle移动设备模拟模式
  • 大连指令数据集的创建--数据收集与预处理_02
  • DeepSeek05-大模型WebUI
  • 【从零开始学Redis】高级篇--超全总结笔记
  • [实现Rpc] 测试 | rpc部分功能联调 | debug | 理解bind
  • 倚光科技:助力玻璃非球面的打样与小批量生产
  • 06C语言——指针
  • 算法系列之递归反转单链表
  • k8s集群内的pod连接集群外部的mysql, k8s集群内部服务如何连接集群外部mysql? 一文搞明白
  • 设计模式总结
  • JVM系列--虚拟机类加载机制
  • 从零开始设计一个完整的网站:HTML、CSS、PHP、MySQL 和 JavaScript 实战教程
  • STM32【3】芯片的底层组成概论
  • 从 Linux 服务器到前端到网关到后端业务逻辑的分析
  • 基于Springboot的小说网站【附源码】
  • 广西隆林突发山洪,致3人遇难1人失联
  • 陈刚:推动良好政治生态和美好自然生态共生共优相得益彰
  • 当“小铁人”遇上青浦,看00后如何玩转长三角铁三
  • 美国务卿鲁比奥抵达会场,将参加俄乌会谈
  • 商务部召开全国离境退税工作推进会:提高退税商店覆盖面,扩大入境消费
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑