赞
踩
数据类型 | 物理内存 | 索引 |
---|---|---|
固定数组 | 编译时创建,之后不能修改 | 数字 |
动态数组 | 仿真时创建,仿真期间可以改变 | 数字 |
队列 | 仿真时push-pop可以改变队列大小 | 数字 |
关联数组 | 仿真时分配内存 | 数字、字符串、类 |
数字电路主要分为两类:1)组合逻辑电路;2)时序电路;使用触发器的原因:用触发器是因为触发器能保存数据,保存电路状态;触发器是在时钟边沿触发,用时钟同步是让整个电路能同步整齐划一的工作;乘法器的计算部分是组合逻辑,不需要触发器,计算后的结果可以用触发器保存起来。具体为什么使用触发器?
触发器与锁存器的联系与区别
(1) 寄存器是同步时钟控制,而锁存器是电位信号控制。锁存器一般由电平信号控制,属于电平敏感型。寄存器一般由时钟信号控制,属于边沿敏感型。
(2) 寄存器的输出端平时不随输入端的变化而变化,只有在时钟有效时才将输入端的数据送输出端(打入寄存器),而锁存器的输出端平时总随输入端变化而变化,只有当锁存器信号到达时,才将输出端的状态锁存起来,使其不再随输入端的变化而变化。
可见,寄存器和锁存器具有不同的应用场合,取决于控制方式以及控制信号和数据之间的时间关系:若数据有效一定滞后于控制信号有效(锁存信号(控制信号)来了以后,才将输出端的状态/数据锁存起来),只能使用锁存器;如果数据提前于控制信号而到达且要求同步操作,则可以用寄存器来存放数据。
换言之,控制信号/时钟信号先来,数据后来,用锁存器;
控制信号/时钟信号后来,数据先来,用寄存器。
Latch的建立时间与保持时间。
锁存器的建立和保持时间是以最后CLK高电平消失时间点为基准的,如下图所示:
建立时间(tsetup):
建立时间是在CLK高电平消失之前的最小建立时间
保持时间(thold):
建立时间是在CLK高电平消失之后的最小保持时间
TClk-Q:是CLK电平触发时到数据Q改变时的延时。
tD-Q:电平触发期间,输出由数据输入D改变到输出Q改变的延时。
在Latch的输入开关断开和环路开关闭合时,有效的D输入信号在跳变前(建立时间)和跳变后(保持时间)的短时间内不能发生变化。以保证数据被锁存。
寄存器和锁存器的建立保持时间
fork...join
块内的线程必须执行完才能开始该块后面的语句;fork.....join_none
块内、块外同时执行,块后的线程不必等块内线程结束。通常使用该语句来产生线程fork.....join_any
只要块内的线程有一个执行结束,就执行块之后的线程,块内的也继续执行。通常使用该语句实现线程同步disable fork
,下面是使用实例:initial begin
fork
task1; // Process 1
task2; // Process 2
join_any
$display(“One of task1/2 completed ”);
disable fork;
$display(“All other tasks disable now”);
end
->even_handle
,等待:@ or wait(even_handle.triggered)
;Method | description |
---|---|
new() | creat a mailbox |
put() | place a message in a mailbox |
try_put() | try to place a message in a mailbox without blocking |
get()/peek() | retrieve a message from a mailbox |
num() | returns the number of messages in the mailbox |
try_get()/try_peek() | try to retrieve a message from a mailbox without blocking |
Method | description |
---|---|
new() | creat a semaphore with a specified number of keys |
get() | obtain one or more keys from the bucket |
put() | obtain one or more keys from the bucket |
try_get() | try to obtain one or more keys without blocking |
浅拷贝可以使用列表自带的copy()函数(如list.copy()),或者使用copy模块的copy()函数。深拷贝只能使用copy模块的deepcopy(),所以使用前要导入:from copy import deepcopy
如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。
如果拷贝的对象里的元素包含引用(像一个列表里储存着另一个列表,存的就是另一个列表的引用),那浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开。
virtual interface是在仿真运行时才连接到DUT上,如果只是interface,在编译时就必须进行连 接,在class中时是automatic,在运行的时候产生; virtual interface主要完成接口的动态分配,只要在top层定义virtual interface,其他层不需要 改变,直接通过interface传递参数即可; 消除绝对路径,避免修改的时候改很多东西## 九、常见代码学习
return:function返回值,task返回控制,
continue:本次循环后面的语句不执行,执行下一次的循环
break:循环会不继续进行了。具体
通过断言、verdi查看波形、log打印等进行debug;
(持续更新…)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。