Systemverilog中processes的记录

Processes general:

  • Structured procedures
    • (initial procedures, always procedures, final procedures, task, function)
  • Block statements
    • (begin-end sequential blocks, fork-join parallel blocks)
  • Timing control
    • (delays, events, waits, intra-assignment)
  • Process threads and process control

1. always_combalways @*的区别

  • always_comb在time zero时会自动执行一次,但always@*只会在敏感列表变化时执行
  • always_comb对function内部的内容也是敏感的,但是always@*只对function的参数敏感
  • always_comb内部左手边的变量不能在其他processes中再进行赋值的,然而always@*允许多个processes对同一个变量赋值
  • always_comb内的statements不能包含blocking timing、event controls或fork_join语句

2. block names的用处

Sequential block(begin…end)和parallel block(fork…)都可以加上block name,命名块的用处有:

  • 允许local variables、parameter和命名event可以通过hierarchiy引用;
  • 允许block可以在statements语句里引用,例如使用disable statement。

3. procedural timing controls

仿真时间的推进可以用以下三种方法之一:

  • Delay control:#
  • Event control:@
  • Wait statement,它像是event control和while loop的结合。

4. event trigger

Procedural statement的执行可以和net/variable的值改变或declared event的出现俩同步,前者也称为detecting an implicit event。Implicit event可以指定方向:posedge/negedge/edge,edge=posedge+negedge

Implicit event也可以用于探测expression的值改变,edge event是探测expression中LSB的变化,但表达式的任何操作数的值的变化而不改变表达式的结果将不会被检测为event。

5. intr-assigment timing control

6. process execution threads

如下情况,sv会创建执行线程:

— Each initial procedure

— Each final procedure

— Each always, always_comb, always_latch, and always_ff procedure

— Each parallel statement in a fork-join (or join_any or join_none) statement group

— Each dynamic process

对于continuous assignment也可以考虑为自己的thread。

7. wait fork/disable/disable fork

wait fork会等待当前process创建的child subprocesses都结束后,才会继续执行,不包含这些子进程自己又创建的子进程。

disable会停止一个命名块或task中的所有activity,不管parent-child关系,子process可以停止parent process,其它process也可以停止unrelated process

disable fork会停止process的执行,但会考虑parent-child关系。它也是会停止所有的active subprocesses,包括衍生的子进程。

8. fine-grain process control

process是一个build-in的class,一旦启动后,它允许其它process去访问和控制。user可以定义process type变量,然后将process object赋值过去。Process class的原型如下:

当衍生出process时,process type的object会在内部创建。user不能创建process type的object,如果尝试用new去创建一个新的new process,那么会导致error产生。并且process class不能被extended,尝试去extend会导致compilation error。

self()函数可以用于返回当前process的handle,也就是说用该handle可以调用该process。

status()函数可以用于返回process status,有以下state枚举类型:

kill()函数会终止给定process和它衍生的子processes,这些subprocesses是在被killed process中使用fork语句创建的。

await() task允许一个process等待另一个process完成,process自身不能自己调用await。

suspend()函数允许一个process暂停自己的执行或其他process的执行。

resume()函数会重启之前suspended process。

kill(), await(), suspend()和resume()只能由initial procedure/always procedure/fork block from one of those procedures创建的process使用。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谷公子的藏经阁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值