分类: 数字IC

9 篇文章

PCIE-设备
下图是一个典型的PCIe体系的topology,图中有以下三类PCIe设备:位于CPU的PCIe Root Complex(包含Host Bridge, RCiEP和Root Port), PCIe Endpoint设备和PCIe Switch。 Root Complex: PCIe Root Complex(根联合体),包含一个Host…
AMBA 协议之 AXI 总线
一、简介 1、AXI 简介 AXI,全称Advanced Extensible Interface,高级可扩展接口,是ARM在AMBA3中推出的核心成员,是现代SOC中实现高带宽、低延迟设备互联的标准接口。AXI的核心设计理念是通道分离、地址/数据解耦、高效握手,能满足从简单寄存器配置到高速DDR存储的各类通信需求,其主要特点如下所示: 分离的地址…
配置XXX使XXX有效遇到的问题
有这样一个场景。 先配置寄存器A,然后配置寄存器B为A5后,A寄存器内容才生效。 我们按配置流程走,先配置寄存器A,再写寄存器B为A5,从业务输出上看到寄存器A的内容确实生效了。这时,我们可能会忽略一个问题,那就是寄存器A生效到底是,在写入寄存器A时就立马生效了,还是在写寄存器B为A5的时候才生效的。 所以,这块我们应该发散我们的思维,去反向思考;…
错误激励我们为啥要发送两次
有这样一个场景。 我们下发一个访问包,当发送的访问包校验正确时,DUT会回复一个正常的响应包,当发送的访问包校验错误时,DUT会回复一个空响应包。 如果我们只发送一个错误访问包,DUT返回了一个空响应包,我们环境同样产生了一个空返回包,这样两个包比对成功,设计行为是符合预期的,看起来没有问题,但是很有可能泄露bug。 我们下发一个错误访问包,DUT…
动态改配计数器阈值可能遇到的问题
现在有这样一个场景。 DUT内有一个计数器,计到阈值后,触发一个功能,然后计数器置0,重新开始计数;如此循环,不断触发相关功能。 例如,计数器阈值为200,当计数器计到100时,我们动态将计数器阈值改配为50,很可能计数器后续会一直计到最大值,然后回卷,当重新计到50时,才会触发相关功能。这样的处理逻辑显然是不可接受的。
Package打包公共函数进阶
我们封装公共函数时,是希望它通用性足够强,可以在多个应用场景中被调用; 说到增强通用性,参数化是最为常见的一种手段; 所以我们在Package打包公共函数时,引入参数类。 package comm_utils_pkg; /* * split bits into bit queue. */ class one_arg#(int arg0); stat…
Package打包公共函数遇到的一些问题
1丶为什么这么做? 我们将一些公共函数封装进Package,方便我们重用,尤其是继承项目,好处尤为明显; 其次,这样做更符合高内聚,低耦合的编码要求。 2丶问题 package comm_utils_pkg; `include "uvm_macros.svh" import uvm_pkg::*; function void bits2byte(b…
带参数的宏定义的一种用法
1 丶应用场景: 当我们 interface 中有几组信号的驱动或采样方式相同时,我们可以把 interface 中的信号作为参数来声明宏定义,将这些相同的操作以带参数的宏定义方式抽象出来。 2 丶举例: 前段时间写 axi master bfm 时,axi 有 5 个通道,每个通道都有一个握手机制;当 a 信号拉高后,进入等待握手状态,开启一个无…
学会打包思想,善用结构体
最近在做项目的时候,发现自己写的代码不是很好,一个 function 或者 task 要好几百行, 主要原因就是,在写代码的时候,想到哪就写到哪,用到之前哪写过的代码就直接粘过来用, 以前还没有什么感觉,甚至觉得这样做还有好处, 想想将一部分代码封装成 function 或者 task,如果抽象程度很高,立意不是很明确,在环境里面调来调去,很容易发…