- 博客(63)
- 收藏
- 关注
原创 硅芯思见:天天说亚稳态,那亚稳态中的MTBF是啥
在进行电路仿真时,特别是后仿真时,经常会遇到时序违例,常见的有setup违例和hold违例,然后究其原因和危害时,常常会谈论到亚稳态,而谈到亚稳态解决方法时,常常会说到两触发器同步结构。这其实就牵扯亚稳态讨论中的一个关键概念:MTBF,本文,将通过对于MTBF的讨论,示例使用三个或多个触发器到底值不值(当然,如果你抬杠,有钱任性,你的芯片对于时序资源面积功耗等等无要求,n级同步也是可以的)?在具体的电路设计中,特定信号传输的亚稳态的MTBF可以使用与设计和器件相关的特性信息来计算评估。
2025-01-29 19:52:28
285
1
原创 硅芯思见:此非(!)非彼非(~)
一些初学者经常在编写判断条件表达式时经常混用"!"和"~",导致仿真结果有时正确有时错误,出现这种情况的原因是因为对于"!"和"~"没有正确理解和使用导致的,本文将以具体示例说明两者的差异.
2022-11-26 11:29:23
431
原创 硅芯思见:惯性延迟(inertial delay)和传输延迟(transport delay)
本文通过示例说明惯性延迟(inertial delay)和传输延迟(transport delay)两者的区别差异
2022-10-22 07:36:19
3410
16
原创 硅芯思见:编译命令指定隐性线网类型
在Verilog中,对于未指定线网类型的隐性线网默认的类型为wire,如果没有对线网进行上拉或者下拉操作,那么其状态为高阻态,即“Z”。对于特定设计在后端实现时会对相应的端口进行上下拉操作,为了保持这种特性,除了显示声明线网类型为tri0或者tri1等外,还可以通过编译命令实现端口上下拉。本文将对通过编译命令实现线网类型的设置进行示例。
2022-10-18 23:31:29
676
原创 硅芯思见:线网或变量宽度与端口宽度不匹配
在使用Verilog进行数字设计或者构建验证平台时,如果连接模块端口的线网或变量的宽度与端口定义的宽度不一致,在进行仿真时将有可能出现逻辑功能与期望不一致的情况,本文将对此类情况进行示例分析。
2022-10-07 10:18:28
800
原创 硅芯思见:1 bit宽的未声明线网
Verilog中对于未声明线网的处理一方面极大地简化了大规模设计或者网表中各模块的互联,另一方面如果使用不当也将会导致设计逻辑功能的异常。例如,线网连接到指定宽度端口的设计时,仿真后发现该矢量端口仅有最低位发生变化,其余各位未发生预期的变化。本文将对未声明线网在引起的此种情况以具体示例进行分析说明。
2022-10-06 11:09:18
174
原创 硅芯思见:Timing Borrow深入浅出
Timing Borrow技术又称为cycle stealing技术,其原理主要是利用latch的电平敏感特性,通过有效电平获取数据再通过无效电平保持被锁存的数据,主要用于解决路径时序不满足电路要求的情况.本文通过示例说明了timing borrow原理
2022-10-05 11:07:07
1891
原创 硅芯思见:关于generate用法的总结
Verilog中generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always语句、initial语句和门级实例引用语句等。细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并完成层次的引用。本文将对generate的几种机构进行示例说明.
2022-10-04 09:58:14
638
原创 硅芯思见:$test$plusargs和$value$plusargs用法小结
$test$plusargs和$value$plusargs作为进行Verilog和SystemVerilog仿真运行时调用的系统函数,可以在仿真命令中直接通过进行赋值的方式将参数传递进入到设计中,并且不局限于不同仿真器对于参数在仿真命令中定义格式不同的限制,也避免了调换参数带来的频繁编译等问题。使用这两条函数对于搭建测试平台有一定的便利,同时对于理解Factory中用例是如何传递进Proxy Class有一定的帮助。
2022-10-03 16:28:59
5281
2
原创 硅芯思见:线网的隐性声明
线网(net)作为Verilog语言中两种主要数据类型之一(变量数据类型和线网数据类型),主要用来模拟数字设计中连接多个不同模块或者模型的物理连线,因此线网是不存储数据的(除了trireg类型),仿真时线网上显示的数据由驱动该线网的驱动源决定的。如果线网没有被有效驱动,那么其上表现出来的数据是高阻态(除了trireg)。同时同一个模块中不允许对同一个线网进行多次声明。
2022-10-02 15:28:13
119
原创 硅芯思见:assert成功失败后的分号到底要不要
在SystemVerilog中,经常会在对数据进行随机化时用到断言,用以判断随机是否成功,在使用过程中经常会遇到断言后的语句有时候有分号分割,有时候没有,那么到底什么时候有什么时候没有呢?本文将以即时断言为例,说明断言的那些分号的存亡。
2022-09-12 23:27:25
368
原创 硅芯思见:SystemVerilog中的静态约束
在SystemVerilog中,经常会在对数据进行随机化时用到断言,用以判断随机是否成功,在使用过程中经常会遇到断言后的语句有时候有分号分割,有时候没有,那么到底什么时候有什么时候没有呢?本文将以即时断言为例,说明断言的那些分号的存亡。...
2022-08-30 23:36:02
265
原创 硅芯思见:m_sequencer和p_sequencer到底谁大
本文通过示例介绍m_sequencer和p_sequencer之间的区别和联系
2022-07-03 19:31:05
1104
2
原创 硅芯思见:问芯吾跬(IC设计验证常见问题汇总一)
本文分享整理的一些IC设计验证的一些常见问题,希望对于需要的朋友有用,后续还会更新。当然更希望有识之士可以留言分享对于其中问题的见解,为其他入门阅读本文的朋友广开思路,教学相长,互相学习。...
2022-06-13 22:54:49
568
原创 硅芯思见:你知道get_coverage和get_inst_coverage得到的都是什么覆盖率吗
在SystemVerilog中提供了大量的用于获得coverage的方法,方便了用户进行功能覆盖率的收集,比较常见的主要有:$get_coverage、get_coverage和get_inst_coverage,那么这几种get coverage得到的到底是什么coverage彼此之间有什么差异呢?本文示例说明之间差异
2022-05-23 20:06:56
2239
2
原创 硅芯思见:SystemVerilog类中的静态方法和属性
在SystemVerilog中关于方法有两种“static”,一种是具有静态生命周期的方法(参见《SystemVerilog中的生命周期lifetime》),另一种则是静态的方法,这种方法常见于类中,先来看下两者的声明方式,如下:[task/function]staticmethod_name(arg_list); // static methodstatic[task/function] method_name(arg_list); // static lifetime可见两.........
2022-05-01 08:30:33
1593
7
原创 硅芯思见:SystemVerilog中的生命周期lifetime
在SystemVerilog中我们经常会用到static,用以表示一种“静态”,而这种“静态”经常用来表示变量在整个仿真过程中的“存活期”,即生命周期。关于这个所谓的生命周期我们先通过一个示例有个直观的了解。【示例】【仿真结果】示例中,任务add2x2在initial过程块中被调用了两次,两次调用的时间不同,传入的参数也不同,但是最终的仿真结果是相同的,并且从仿真波形上可以看到任务add2x2中的temp在3ns时,从1变成了2,并且正是因为这次temp的变化导致第一次调用add2x2.
2022-05-01 08:27:07
416
原创 硅芯思见:SystemVerilog中unpacked数组的assignment pattern
在SystemVerilog中根据数组中元素的存储方式,将数组细分为了packed数组和unpacked数组,packed数组一般使用拼接({})操作实现初始化赋值,unpacked数组则使用数值列表(‘{})的方式实现初始化赋值。根据大家熟知的绿皮书《SystemVerilog For Verification 2nd》中示例Sample 2.7中使用default等方式进行赋值,但是这个示例的仿真可能与我们期望的并不一样,仿真结果如下。示例的仿真结果如下:纳尼?为什么编译都不通过。主要.
2022-04-20 23:17:46
2896
原创 硅芯思见:SystemVerilog类中方法定义在类外的那些事儿
在SystemVerilog中所有类的方法都可以定义于类内,也可以定义于类外。一般将比较复杂的方法的实现放在类外,这样可以增加代码的可读性,而比较简单的方法在类内实现。如果什么方法的定义都放于类内部的话,那么查找一个方法将会比较麻烦。所以在实际使用时,经常将方法定义于类外,方法定义于类外一般分为两步实现:第一步:在类内完成方法原型的声明,此时在方法原型前要使用关键字extern;第二步:在类外实现方法,此时方法名前需要加上“类名::”,用于限定了该方法属于哪个类;在完成了上述两步后,就完成了类内
2022-04-11 06:37:01
754
原创 硅芯思见:SystemVerilog中相互“嵌套”的队列和动态数组
在SystemVerilog中为了实现对于数组的动态操作引入了队列和动态数组,两种数据结构都能够根据需要动态的控制数组的大小,可以存储的数据类型也十分丰富,那么如果想实现队列和动态数组之间的相互存储应该如何实现呢?本文将示例实现队列和数组之间的相互存储。1队列中的元素为动态数组【示例】【仿真结果】示例中,通过typedef定义了自定义string类型的动态数组CHINA,然后声明了一个队列qarr,其中元素类型为CHINA。因为CHINA是动态数组,所以可以通过’{}的方式对其进..
2022-03-20 23:22:02
1387
原创 硅芯思见:SystemVerilog中的packedarray和unpacked array
【注】因为在很多书籍资料中关于packed array和unpacked array有不同的翻译,有的称之为压缩数组和非压缩数组,有的称之为合并数组和非合并数组,为了避免混淆,本文不采用任何翻译名称,仅使用packed array和unpacked array。在SystemVerilog中一般认为数组维数声明位于数组名左侧的数组为packed array,并且在使用时经常也将一维的packed array作为vector;维数位于数组名右侧的数组称之为unpacked array,当维数同时出现在数组
2022-03-20 23:20:31
5438
原创 硅芯思见:SystemVerilog中格式化输出域宽(field width)如何设置
SystemVerilog和Verilog中格式化显示域宽设置示例
2022-03-02 23:30:29
1899
原创 硅芯思见:SystemVerilog中队列的越界访问
SystemVerilog中队列的当前大小可以通过size()函数获得,队列中元素的个数也可以通过队列中最大索引值和最小索引值获得,在使用队列时,我们经常用SystemVerilog提供的各种方法对队列进行访问,但队列同样也支持通过索引的方式进行访问,并且这种方式也会被经常用到,这个时候就有可能出现访问队列时,索引值大于队列的大小范围,产生队列越界访问的情况,从而可能获得不期望的结果。为此,本文通过示例说明通过索引访问队列产生的一些异常情况,队列正常访问操作可参见《SystemVerilog中有界无界的队列
2022-01-15 00:16:35
897
原创 硅芯思见:setup和hold violation原来是这么回事儿
题外话:西安发生了疫情(新冠和出血热),但是一切都会过去,雨后总会天晴!!!在后仿真过程中经常会遇到关于setup和hold violation的问题,但是关于setup和hold time的产生原因和由来很多人还比较朦胧,为此本文通过解剖一个边沿触发器简要说明setup和hold产生原因。解剖示例上图为触发器的简要示意图(clk和’clk为反向时钟)。T1和T4同时导通,T2和T3同时导通,且T1、T4和T2、T3导通状况互反。其中T1、T2、T3、T4均为传输门,均为电平敏感,所以所谓的
2021-12-23 23:06:39
7318
1
原创 硅芯思见:SystemVerilog中clocking block中的输入偏差和输出偏差
本文示例SystemVerilog中clocking block的输入偏差和输出偏差的使用
2021-12-18 23:36:57
4422
4
原创 【原创】SystemVerilog和Verilog中的表达式位宽
self-determined和context-determined示例用法和注意事项
2021-12-06 23:22:22
4150
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人