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_comb和always @*的区别
- 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使用。
文章来源:https://www.toymoban.com/news/detail-408116.html
文章来源地址https://www.toymoban.com/news/detail-408116.html
到了这里,关于Systemverilog中processes的记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!