11.Scheduling semantics(调度语义)

102 篇文章 13 订阅

11.1 Execution of a model(模型的执行)

        本标准条款描述了语言中每个元素的行为。本条款概述了这些元素之间的交互,特别是在事件的调度和执行方面。组成Verilog HDL的元素可以用来描述电子硬件在不同抽象层次上的行为。
HDL必须是一种并行编程语言。某些语言构造的执行是通过块或进程的并行执行来定义的。重要的是要了解什么样的执行顺序是保证给用户的,什么样的操作顺序是不确定的。尽管Verilog HDL不仅仅用于模拟,但语言的语义是为模拟而定义的,其他一切都是从这个基本定义中抽象出来的。

11.2Event simulation(事件模拟)
        Verilog HDL是根据离散事件执行模型定义的。离散事件模拟在本子条款中有更详细的描述,以提供一个上下文来描述Verilog HDL结构的含义和有效解释。这些结果定义为仿真提供了标准Verilog参考模型,所有符合要求的模拟器都应实现该模型。然而,在接下来的定义中有很多选择,并且在不同的模拟器之间,执行的一些细节可能会有所不同。此外,Verilog HDL模拟器可以自由使用与本条款中描述的算法不同的算法,前提是用户可见效果与参考模型一致。设计由连接的执行线程或进程组成。进程是可以被评估的对象,可能有状态,并且可以对其输入的变化做出响应以产生输出。进程包括原语、模块、initial和always过程块、连续分配、异步任务和过程赋值语句。

        被模拟电路中的网络或变量值的每一次变化以及命名事件都被视为更新事件
        进程对更新事件敏感。执行更新事件时,将以任意顺序评估对该事件敏感的所有进程。进程的评估也是一个事件,称为评估事件。
        除了事件,模拟器的另一个关键方面是时间。术语“模拟时间”用于指由模拟器维持的时间值,以模拟被模拟电路所需的实际时间。在本条款中,术语时间与模拟时间可互换使用。事件可能发生在不同的时间。为了跟踪事件并确保以正确的顺序处理这些事件,这些事件被保存在事件队列中,按模拟时间排序。将事件放入队列称为调度事件。

11.3 The stratified event queue(分层事件队列)

        Verilog事件队列在逻辑上分为五个不同的区域。事件将添加到五个区域中的任何一个,但仅从活动区域中删除。

a) 活动事件发生在当前模拟时间,可以按任何顺序处理。
b) 非活动事件发生在当前模拟时间,但应在处理所有活动事件后进行处理。
c) 非阻塞分配更新事件已在之前的某个模拟时间进行了评估,但应在处理所有活动和非活动事件后在该模拟时间进行分配。
d) 在处理所有活动、非活动和非阻塞分配更新事件后,应处理监视器事件。
e) 未来的事件发生在未来的某个模拟时间。
未来事件分为未来非活动事件和未来非阻塞分配更新事件。

        所有活动事件的处理称为模拟周期。在Verilog HDL中,选择任何活动事件进行即时处理的自由是不确定性的重要来源。显式零延迟(#0)要求暂停进程并将其添加为当前时间的非活动事件,以便在当前时间的下一个模拟周期中恢复进程。非阻塞分配(见9.2.2)将创建一个非阻塞分配更新事件,该事件将在当前或以后的模拟时间内安排。$monitor和$strobe系统任务(参见17.1)为其参数创建监视器事件。这些事件在每一个连续的时间步长中持续重新启用。监视器事件是唯一的,因为它们不能创建任何其他事件。使用PLI例程(如vpi_register_cb(cbReadWriteSynch))(见27.33)调度的回调过程应视为非活动事件。

11.4  Verilog simulation reference model(Verilog仿真参考模型)

        在下面的所有示例中,T表示当前模拟时间,所有事件都保存在事件队列中,按模拟时间排序。

while (there are events) {
    if (no active events) { 
        if (there are inactive events) { 
            activate all inactive events; 
        } else if (there are nonblocking assign update events) {
            activate all nonblocking assign update events; } 
          else if (there are monitor events) {
            activate all monitor events;
        } else { 
            advance T to the next event time; 
            activate all inactive events for time T;
        } 
        }
        E = any active event;
        if (E is an update event) { 
            update the modified object; 
            add evaluation events for sensitive processes to event queue; 
            } else { /* shall be an evaluation event */ 
            evaluate the process; 
            add update events to the event queue; 
        } 
    } 

11.4.1 Determinism(确定性)

a) begin-end块中的语句应按其在该begin-end框中出现的顺序执行。可以暂停特定开始-结束块中的语句的执行,以支持模型中的其他进程;但是,在任何情况下,begin-end块中的语句都不能以源代码中出现的顺序以外的任何顺序执行。
b) 应按照执行语句的顺序执行非阻塞分配(见9.2.2)。
考虑以下示例:

initial 
    begin
        a <= 0;
        a <= 1;
    end

        当执行此块时,将有两个事件添加到非阻塞分配更新队列中。前一条规则要求按源顺序将它们输入队列;该规则要求从队列中获取它们,并按照源代码顺序执行。因此,在模拟时间0结束时,变量a将被赋值为0,然后为1。

11.4.2Nondeterminism(非确定性)

        不确定性的一个来源是活动事件可以从队列中取出并以任何顺序处理。非确定性的另一个来源是行为块中没有时间控制构造的语句不必作为一个事件执行。时间控制语句是#expression和@expression构造(参见9.7)。在评估行为语句的任何时候,模拟器可以暂停执行,并将部分完成的事件作为挂起的活动事件放置在事件队列上。这样做的效果是允许进程执行的交错,尽管交错执行的顺序是不确定的,并且不受用户控制。

11.5  Race conditions(竞争条件)
        由于表达式求值和网络更新事件的执行可能混合在一起,因此可能存在竞争条件:

assign p = q; 
initial begin
    q = 1;
    #1 q = 0; 
    $display(p);
end

        显示1或0都是正确的。将0分配给q将使能p的更新事件。模拟器可以继续并执行$display任务,或者执行p的更新,然后执行$display。

11.6 Scheduling implication of assignments(赋值的调度含义)
11.6.1连续赋值
        连续赋值语句(第6条)对应于对表达式中的源元素敏感的过程。当表达式的值发生更改时,它会使用当前值来确定目标,从而将活动更新事件添加到事件队列中。还将在时间0处评估连续赋值过程,以确保传播常量值。这包括隐式连续赋值(见11.6.6)。
11.6.2程序性连续赋值
        过程连续赋值(即assign或force语句;参见9.3)对应于对表达式中的源元素敏感的过程。
当表达式的值发生更改时,它会使用当前值来确定目标,从而将活动更新事件添加到事件队列中。
deassign或release语句将停用任何相应的assign或force语句。
11.6.3阻塞赋值
        带有延迟的阻塞赋值语句(见9.2.1)使用当前值计算右侧值,然后使执行过程暂停并作为未来事件进行调度。如果延迟为0,则该进程在当前时间被安排为非活动事件。当进程返回时(或者如果没有指定延迟,则立即返回),进程将执行左侧的赋值,并根据左侧的更新启用任何事件。
进程恢复时的值用于确定目标。然后可以继续执行下一个顺序语句或其他活动事件。

11.6.4非阻塞赋值
        非阻塞赋值语句(见9.2.2)始终计算更新值,并将更新安排为非阻塞赋值更新事件,如果延迟为零,则在该时间步骤中,或者如果延迟为非零,则作为未来事件。将更新放置在事件队列上时生效的值用于计算右侧值和左侧目标。
11.6.5开关(晶体管)处理
        11.4中描述的事件驱动模拟算法依赖于单向信号流,可以独立处理每个事件。读取输入,计算结果,并安排更新。Verilog HDL除了提供行为和门级建模之外,还提供开关级建模。开关提供双向信号流,需要对开关连接的节点进行协调处理。为开关建模的Verilog HDL源元件是各种形式的晶体管,称为tran、tranif0、tranif1、rtran、rtranif0和rtranif1。开关处理应考虑双向交换连接网络中的所有设备,然后才能确定网络上任何节点的适当值,因为输入和输出相互作用。模拟器可以使用松弛技术来实现这一点。模拟器可以随时处理事务。它可以在特定时间处理一组串连接事件,并与其他活动事件的执行混合。
        当某些晶体管具有栅极值x时,需要进一步细化。一种概念上简单的技术是将这些晶体管设置为全导通和非导通晶体管的所有可能组合来重复求解网络。在所有情况下,具有唯一逻辑电平的任何节点都具有等于该电平的稳态响应。所有其他节点都具有稳态响应x。

11.6.6端口连接
        端口通过隐式连续赋值语句或隐式双向连接来连接进程。双向连接类似于两个网络之间始终启用的传输连接,但没有任何强度降低。端口连接规则要求值接收器是网络或结构网络表达式。端口始终可以表示为声明的对象,连接方式如下:

如果是输入端口,则是从外部表达式到本地(输入)网络的连续赋值
如果是输出端口,则从本地输出表达式到外部网络的连续赋值
如果是输入,则是将本地网络连接到外部网络的非强度减小晶体管

        原语端口与模块端口不同。原语输出和输入端口应直接连接到1位网络或1位结构网络表达式(见12.3.9.2),不存在可能改变强度的干预过程。原语评估的更改被安排为连接网络上的活动更新事件。连接到1位网络或1位结构网络表达式的输入端子也直接连接,没有可能影响强度的干预过程。连接到其他类型表达式的输入端口表示为从表达式到连接到输入端口的隐式网络的隐式连续赋值。
11.6.7功能和任务
        任务/函数参数传递是按值传递的,它在调用时复制,在返回时复制。返回函数上的复制操作与任何阻塞赋值的操作方式相同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值