|
23. 动态过程 verilog通过使用fork-jion提供了一种静态的并发过程。每一个分支都是一个分离的、并行的过程。fork-jion中任何语句的执行必须在组内的每一个过程完成后才会执行。例如: initial begin fork send_packet_task (1, 255, 0); send_packet_task (7, 128, 5); watch_result_task (1, 255, 0); watch_result_task (7, 128, 5); jion // 所有的任务必须完成后才会到达这里 end
SystemVerilog通过process关键字加入了一个新的、动态的过程。它为一个过程产生分支,然后继续执行而无需等待其他过程完成。过程不会阻塞过程或任务内的语句执行。这种方式能够建模多线程的过程。例如: initial begin process send_packet_task (1, 255, 0); process send_packet_task (7, 128, 5); process watch_result_task (1, 255, 0); process watch_result_task (7, 128, 5); end // 所有的过程并行运行
24. 任务和函数增强 SystemVerilog为Verilog的任务和函数作了几个增强。 l 静态和自动的存储 缺省情况下,在Verilog任务或函数内的所有存储都是静态的。Verilog-2001允许将任务和函数声明成自动的。在SystemVerilog中:(1). 在一个静态任务和函数内的特定数据可以显式地声明成自动的。声明成自动的数据在块中具有完整的生命周期,并且在任务和函数调用的入口处初始化;(2). 在一个自动的任务或函数中的特定数据可以显式地声明成静态的。自动的任务或函数中声明成静态的数据在一个块的本地范围内具有静态的生命周期。 l 从任何点返回 Verilog在一个任务或函数中执行到endtask或endfunction关键字的时候返回。函数的返回值是给函数名赋的最后一个值。SystemVerilog加入了一个return关键字,使用这个关键字,一个任务或函数可以在任何点上返回。 l 多语句 Verilog要求一个任务或函数只具有一个语句或语句块。多条语句必须组合到一个单一的begin-end或fork-jion块中。SystemVerilog去除了这种限制。因此,多条语句可以在一个任务或函数中列出而无需使用的begin-end或fork-jion。每有分组的语句就像在begin-end中一样顺序执行。我们还可以产生一个没有语句的任务或函数定义。 l void函数 Verilog要求一个函数具有一个返回值,函数的调用接收这个返回值。SystemVerilog加入了一个void数据类型,这个数据类型可以作为一个函数的返回值类型。void函数可以像Verilog任务一样进行调用,而无需接收一个返回值。void函数和任务的差别在于函数存在几个限制,例如没有时间控制等。 l 函数的输入和输出 Verilog标准要求一个函数至少具有一个输入并且函数只能具有输入。SystemVerilog去除了这些限制。函数可以具有任意数目的输入、输出以及输入输出,也可以什么也没有。
|