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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ethan_WC

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

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

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

打赏作者

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

抵扣说明:

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

余额充值