SV基础(二):数据类型

devtools/2025/3/1 11:40:04/

文章目录

      • **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 beginrepeat(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位无符号数)
    二进制十进制值
    0000
    0011
    1117

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

  • 范围


http://www.ppmy.cn/devtools/163606.html

相关文章

基于STM32的智能教室管理系统

1. 引言 传统教室管理依赖人工操作,存在设备控制分散、能源浪费严重、环境舒适度低等问题。本文设计了一款基于STM32的智能教室管理系统,通过多环境参数监测、设备智能联动与数据驱动优化,实现教室设备集中管控、能耗精细化管理与学习环境自…

java 实现xxl-job定时任务自动注册到调度中心

xxl-job 自动注册(执行器和任务) 前言 xxl-job是一个功能强大、简单易用、高可用且可扩展性强的分布式定时任务框架/分布式任务调度平台。它适用于各种需要定时任务调度的场景,并可根据业务需求进行灵活配置和扩展。 xxl-job简介 xxl-job是一个开源的分布式定时任务框架,…

java面试题(一年工作经验)的心得

看面试题 正常人第一步肯定都会看面试题,我也不例外,在看的过程中,我发现有些文章写的不错,对我帮助不小值得推荐,如下: Java面试题全集(上) 很多基础的东西,建议先看。…

FreeRTOS基础知识学习指南

以下内容涵盖FreeRTOS的核心概念,包括任务管理、调度、中断、互斥量与信号量、队列和内存管理等主题。每部分提供基本原理说明,并辅以简要的代码示例帮助理解。 1. 任务管理 (Task Management) 任务的创建与删除:FreeRTOS中的任务相当于独立…

请求对象和响应对象

目录 一、Tomcat 请求与响应 定义 二、HttpServletRequest基本功能 1.重要性 2.功能分类 3.获取请求头数据 方法 示例 结果: 4.其他请求相关方法 e.g 示例 结果: 三、HttpServletRequest获取参数 1.传递参数的方式 示例1 示例2&#xf…

【jira】用到几张表

jira用到的几张表 测试计划,测试周期,测试用例,问题记录 1. 测试计划 # 记录表,查计划详情 SELECT ID,issuenum,SUMMARY FROM jiraissue where issuenum 22871# 测试计划下,测试周期,查测试周期id&…

RabbitMQ 集群部署方案

RabbitMQ 一、安装 RabbitMQ 二、更改配置文件 三、配置集群 四、测试 环境准备:三台服务器,系统是 CentOS7 IP地址分别是: rabbitmq1:192.168.152.71rabbitmq2:192.168.152.72rabbitmq3:192.168.152.…

微信小程序读取写入NFC文本,以及NFC直接启动小程序指定页面

一、微信小程序读取NFC文本(yyy优译小程序实现),网上有很多通过wx.getNFCAdapter方法来监听读取NFC卡信息,但怎么处理读取的message文本比较难找,现用下面方法来实现,同时还解决几个问题,1、在回调方法中this.setData不更新信息,因为this的指向问题,2、在退出页面时,…