system verilog学习记录1-- 基础

system verilog学习记录1-- 基础

  1. 变量类型

    四值逻辑是硬件的概念 (v中的reg和wire --> sv中的logic)
    二值逻辑是软件的概念 (bit)

在这里插入图片描述在这里插入图片描述

注意:

  1. 应该尽量避免对两种不同类型的变量进行操作。
  2. C中int型不做初始化默认是随机的,但是SV中不做初始化默认是0;Sv中integer的默认值是x,因为integer是四值逻辑,而int是二值逻辑。
  3. 初学者不用理会这么多数据类型,sv中统一只用bit/logic + 位宽 + 寄存器名称即可
  1. 数组
    1)定宽数组
    多维数组
// 16个 int (32位) 的数
int lo_hi[16]// 等效于int lo_hi[0:15];
int lo_hi[0:15]; 	// (从低到高);  
int lo_hi[15:0]; 	// 也可以反着写,(从高到低); 
// 并不是8个4位的数,而是8*4个int(32位)的数
// 像这种放在一起的,左边是高维度,往右依次为往下降维度。
int array_a [0:7][0:3]; // 完整声明
int array_b [8][4];		// 紧凑声明

在这里插入图片描述
2)动态数组
在这里插入图片描述

这里需要注意:

  1. 类的创建是new()而不是new[]。这个很容易混淆。new[]只是针对动态数组
  2. dyn = new[20] (dyn); 重新创建20个数的空间,并且把之前的数复制进去

3)关联数组

bit [63:0] assoc[int], 注意[ ]里边是数据类型,–> 关联数组。
注意,用foreach遍历关联数组的时候,它可能是无序的打印出来,需要我们自己来做排序
==> 先对标号做个排序,思路: 将标号放在一个数组里边,利用数组自带的排序.sort(),先对标号做个排序,然后进一步打印出来。

在这里插入图片描述
4)数组相关问题
A. 组合非组合问题(packed 和 unpacked)

以下是组合型, 维度都在数组左侧为组合型数组。
Logic [3:0][7:0] data;
=> 维度放在一起的,维度是从左到右依次降低 ==》 表示4个8位的数

以下两种都是非组合型 ,除了维度放在数据左边,都是非组合型。只要有一个维度出现在数据右边,就都是非组合型。
reg [7:0] table [3:0] ; 或者 reg [7:0] data [4];
⇒ 左侧的是低维度,右侧的是高维度 ⇒ 4个8位的数
reg table [7:0] [1023:0] ;
⇒ 像这种放在一起的,是从左到右维度依次降低。 ⇒ 8个1024位的数

总结:

  1. 维度都在数组左侧为组合型数组;
    只要有一个维度出现在数据右侧为非组合型数组。
  2. 维度是连体娃娃的,从左到右维度依次降低;注意这种情况组合和非组合都有;
    维度被数组从中间分开的,右边是高维度,左边为次高。注意这种情况只有非组合。
  3. 非组合型赋值都需要用 ’{} ,而组合型是不需要的。
    组合型队列,都连续在一起,紧挨着的,赋值不用加’ , 如q2[$] = {3,4};
    动态数组结构体默认是非组合型,都需要’{};也可以加关键词packed强制变成组合型。
    如:
    在这里插入图片描述
  4. 组合型写法更好,会进一步规范数据的存储方式,而不需要关心编译器和操作系统的区别。
  5. 组合型数组比非组合数组方便更加灵活,且不易出错。比如只要位数相等,无论两者如何分配,都可以直接赋值拷贝。以后工程上尽量用组合型数组。
    非组合型和组合型不能相互赋值。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
B. 常见用法

  1. 系统函数 $ size() 默认的完整形式是$size(src,1) , 默认找到的是最高维度数组的长度。
  2. 数组循环遍历时,用forech(dst[j]) 很方便,j会自动从0到最大值,甚至这个j都不需要自己创建,它自己会默认定义。
  3. 数组的大小 用.size()来表示, 而字符串的长度用.lenth()来表示。
  1. 过程块与方法
  1. function和task中传递的只能是变量,只能传输存放数据的,不能传输硬件的信号或者硬件的存储器
  2. 在sv的函数或者任务中,若不表明方向,则所有方向都默认为input。
    function void op_copy(t , s);
    t = s;
    endfunction
    这个是错的,没有任何输出;因为你只有输入值,没有返回值。
  1. 补充
  1. interfance和moudule有什么区别?
    interface 中可以例化接口,但不可以例化module
    module 中可以例化接口,也可以例化module
    其他什么任务啊函数啊两者都可以调用
  2. monitor 不直接检测driver,而是监测接口上的信号,这样才能检测到driver是否真的发出去了;
  3. 尽量不要去检测或者依赖****内部信号,因为
    a.内部信号可能下一次做逻辑优化的时候就去掉了。
    b.在跑门级仿真的时候,会把内部网表的信号打散,内部信号经过优化都已经不见了。
    c.你一旦检测了内部信号,就默认认为该信号一定是对的,但这个信号就真的一定是正确的嘛?
  4. 对于模块来讲,要更多地给他足够多的激励。
    越往上,关注的是,模块与模块之间的互动。
    如果你在顶层,你验什么?
    a. 寄存器配置后看channel、arbiter、formatter是否真的生效了
    b. Channel 进去的数是否就是formater出来的数
    c. 打开或者关闭某些通道对其他通道是否有影响?
    d. 特定时序的检查,如arbitu会不会给formatter错误的时序,比如这一拍是5长度的数,下一拍就变成8长度了。
  5. always@(posedge clk) 块一定能综合成寄存器吗?
    在这里插入图片描述
    ==》 并不是所有的always @ (posedge clk) 都会被综合成寄存器,我之前的理解有错。要综合为寄存器,前提是非阻塞赋值<=
  6. 如何解决采样中的竞争问题?有时候采样的是对的,有时候采样的又是错的。
    用clocking 块 ==> 提前采样,延后输出。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan_WC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值