一种对VerilogHDL进行行为仿真的方法与流程

    专利查询2022-08-16  105


    一种对verilog hdl进行行为仿真的方法
    技术领域
    1.本发明属于仿真领域,特别是涉及一种对verilog hdl进行行为仿真的方法。


    背景技术:

    2.在verilog标准中,所有的事件被分为了下面的5种:活动事件(active event)在当前的仿真事件产生,可以按任意顺序处理;非活动事件(inactive event)在当前仿真时间产生,但必须在所有活动事件处理完成之后再进行处理;非阻塞赋值更新事件(nonblocking assign update event)在之前的某个仿真时间已被计算,但在当前仿真时间,必须在所有活动事件和非活动事件处理完成之后,再进行赋值;监控事件(monitor event)必须在所有活动,非活动,和非阻塞赋值更新事件之后处理;未来事件(future event)在未来某个仿真时间产生,未来事件分为未来非活动事件(future inactive event)和未来非阻塞赋值更新事件(future nonblocking assignment update event)。
    3.但是verilog标准中只给出来抽象模型,没有具体的实现的方法,因为亟需一种对verilog hdl进行行为仿真的方法。


    技术实现要素:

    4.针对以上技术问题,本发明提供一种对verilog hdl进行行为仿真的方法。
    5.本发明解决其技术问题采用的技术方案是:一种对verilog hdl进行行为仿真的方法,方法包括以下步骤:步骤s100:在与verilog保持语义和标准一致的前提下,将调度模型划分为每一时刻都有的5个事件队列,其中,队列a包括值计算、普通赋值语句值更新事件,队列b包括值更新引发的其他值的更新事件,队列c包括0延迟语句值更新事件,队列d包括非阻塞赋值值更新事件队列,队列e包括系统函数监控事件;步骤s200:获取当前仿真时刻的5个事件队列,检测队列a是否为空,若队列a不为空,则依次执行队列a中事件的处理函数;步骤s300:检查队列b是否为空,如果队列b不为空,依次执行队列b中事件的处理函数;步骤s400:检查队列c是否为空,如果队列c不为空,依次执行队列c中事件的处理函数;步骤s500:检查队列b是否为空,如果队列b为空,检查队列d是否为空,如果队列d不为空,依次执行队列d中事件的处理函数;步骤s600:检查队列b是否为空,如果队列b为空,检查队列d是否为空,如果队列d为空,检查是否触发了系统函数,如果触发了,依次执行队列e被触发的系统函数,完成当前仿真时刻的事件队列,取下一个仿真时刻的事件队列作为当前时刻的仿真事件队列,并返回步骤s200,直至仿真结束,退出程序。
    6.优选地,步骤s200还包括:若队列a为空,检查队列d是否为空,若队列d为空,则仿
    真结束,退出程序;若队列d不为空,依次执行队列d中事件的处理函数。
    7.优选地,步骤s300还包括:如果队列b为空,执行步骤s400。
    8.优选地,步骤s400还包括:如果队列c为空,执行步骤s500中检查队列d是否为空的步骤。
    9.优选地,步骤s500还包括:如果队列d为空,则执行步骤s600中检查是否触发了系统函数的步骤。
    10.优选地,步骤s200之前还包括:初始化内存和0时刻的事件队列。
    11.上述一种对verilog hdl进行行为仿真的方法,在保证与verilog标准语义一致的前提下,使用了与verilog标准不一样的事件队列组织和调度方法,更容易使用编程语言实现。
    附图说明
    12.图1为本发明一实施例中一种对verilog hdl进行行为仿真的方法流程示意图。
    具体实施方式
    13.为了使本技术领域的人员更好地理解本发明的技术方案,下面结合附图对本发明作进一步的详细说明。
    14.在一个实施例中,一种对verilog hdl进行行为仿真的方法,方法包括以下步骤:步骤s100:在与verilog保持语义和标准一致的前提下,将调度模型划分为每一时刻都有的5个事件队列,其中,队列a包括值计算、普通赋值语句值更新事件,队列b包括值更新引发的其他值的更新事件,队列c包括0延迟语句值更新事件,队列d包括非阻塞赋值值更新事件队列,队列e包括系统函数监控事件。
    15.具体地, 赋值语句有三种:1、阻塞赋值(普通的赋值语句),形如 a=b;2、非阻塞赋值,形如 a 《= b;连续赋值,形如assign a=b。每种赋值语句都可以加延迟属性,如 #3 a=b表达的语义是:现将b的值记录下来,然后延迟3个时刻再值赋值给a。当延迟的时刻数是0时,就是特殊的语句,构成队列c。队列a:计算a=b这样的阻塞赋值语句;队列b:计算连续赋值语句(assign a=b 这样的赋值语句);队列c:#0 a=b 这样的显示的延迟为0的阻塞赋值语句;队列d:计算 a 《=b 这样的非阻塞赋值语句;队列e:执行$monitor、$strobe这两个系统函数。
    16.步骤s200:获取当前仿真时刻的5个事件队列,检测队列a是否为空,若队列a不为空,则依次执行队列a中事件的处理函数。
    17.在一个实施例中,步骤s200还包括:若队列a为空,检查队列d是否为空,若队列d为空,则仿真结束,退出程序;若队列d不为空,依次执行队列d中事件的处理函数。
    18.在一个实施例中,步骤s200之前还包括:初始化内存和0时刻的事件队列。
    19.步骤s300:检查队列b是否为空,如果队列b不为空,依次执行队列b中事件的处理函数。
    20.在一个实施例中,步骤s300还包括:如果队列b为空,执行步骤s400。
    21.步骤s400:检查队列c是否为空,如果队列c不为空,依次执行队列c中事件的处理函数。
    22.在一个实施例中,步骤s400还包括:如果队列c为空,执行步骤s500中检查队列d是否为空的步骤。
    23.步骤s500:检查队列b是否为空,如果队列b为空,检查队列d是否为空,如果队列d不为空,依次执行队列d中事件的处理函数;在一个实施例中,步骤s500还包括:如果队列d为空,则执行步骤s600中检查是否触发了系统函数的步骤。
    24.步骤s600:检查队列b是否为空,如果队列b为空,检查队列d是否为空,如果队列d为空,检查是否触发了系统函数,如果触发了,依次执行队列e被触发的系统函数,完成当前仿真时刻的事件队列,取下一个仿真时刻的事件队列作为当前时刻的仿真事件队列,并返回步骤s200,直至仿真结束,退出程序。
    25.具体调度方法为:1、0时刻,初始化内存、初始化0时刻的事件队列;2、检查队列a和队列d。如果都为空,执行第`13`步;如果队列a不为空,执行第`3`步;如果队列a为空,队列d不为空,则执行第`10`步;3、依次执行队列a中事件的处理函数;4、检查队列b是否为空,如果不为空,执行第`5`步;否则执行第`6`步;5、依次执行队列b中事件的处理函数,然后执行第`4`步;6、检查队列c是否为空,如果不为空,执行第`7`步;否则执行第`9`步;7、依次执行队列c中事件的处理函数,然后执行第`8`步;8、检查队列b是否为空,如果不为空,执行第`5`步;否则执行第`9`步;9、检查队列d是否为空,如果不为空,执行第`10`步;否则执行第`11`步;10、依次执行队列d中事件的处理函数,然后执行第`8`步;11、检查是否触发了$monitor等系统函数,如果触发了,依次执行队列e被触发的系统函数,然后执行第`12`步;进一步地,monitor监控的变量,值发生了变化,就会触发monitor函数;12、取下一个仿真时刻的事件队列,然后执行第`1`步;13、仿真结束,退出程序。
    26.具体调度流程图如图1所示。
    27.如下verilog代码:module demo;reg a;reg b;wire [1:0]c;initial begina = 0;endinitial beginb 《= a;end
    initial begin#0 a = 1;endinitial begin$monitor("a=%d, b=%d, c=%d", a, b, c);endassign c = a,;endmodule执行情况如下:1、0时刻队列初始化后:(1)队列a会有4个事件,分别对应于4个initial语句。
    [0028]
    (2)队列b为空。
    [0029]
    (3)队列c为空。
    [0030]
    (4)队列d为空。
    [0031]
    2、检查队列a是否为空,发现不为空,处理队列a:(1)处理第一个事件,即会处理a=0语句:

    处理函数会将a的值更新为0;

    然后检查a的值是否发生了变化;

    发现a的值从x(未定值)变化到了0,即发生了改变,会调度被a影响的语句;

    因为assign语句对a的值敏感,所以会将assign语句调度到队列b中。
    [0032]
    (2)处理第二个事件,即会处理b《=a语句:

    因为队列a只处理非阻塞赋值语句的值计算;

    所以只需要将此刻a的值(0)保存起来;

    然后将b的更新调度到队列d中。
    [0033]
    (3)处理第三个事件,即会处理#0a=1语句:

    因为该语句是一个控制语句,所以会触发调度;

    所以会将a=1这个赋值语句加入到队列c中。
    [0034]
    (4)处理第四个事件,即会处理$monitor语句:

    直接执行系统调用处理函数;

    处理函数中会将monitor标记置true,表明当前时刻需要触发monitor。
    [0035]
    3、检查队列b是否为空,发现不为空,处理队列b:(1)此时b队列只有一个事件,即assign语句;(2)执行assign语句的处理函数,取出a的值(0),然后赋值给c。
    [0036]
    4、检查队列b是否为空,发现为空,则进一步检查队列c是否为空,发现队列c不为空,处理队列c:(1)此时队列c只有一个事件,即被#0控制的语句a=1;(2)执行a=1的处理函数,将a的值更新为1;(3)然后检查a的值是否发生了变化;(4)发现a的值从0变化到了1,即发生了改变,会调度被a影响的语句;
    (5)因为assign语句对a的值敏感,所以会将assign语句调度到队列b中。
    [0037]
    5、检查队列b是否为空,发现不为空,处理队列b:(1)此时b队列只有一个事件,即assign语句;(2)执行assign语句的处理函数,取出a的值(1),然后赋值给c。
    [0038]
    6、检查队列b是否为空,发现为空,则进一步检查队列c是否为空,发现队列c也为空。进一步检查队列d,发现队列d不为空,则处理队列d:(1)此时队列d只有一个事件,即要用之前存起来的a的值(0)对b进行更新;(2)更新b(此时b值为0);7、检查队列b是否为空,发现为空,则进一步检查队列c是否为空,发现队列c也为空。进一步检查队列d,发现队列d也为空,则处理系统函数。
    [0039]
    8、因为前面标记了此刻需要执行monitor函数,所以会执行队列e内的monitor系统函数。
    [0040]
    9、跳转到下个仿真时刻。
    [0041]
    10、发现队列都是空的,退出仿真程序。
    [0042]
    上述一种对verilog hdl进行行为仿真的方法,语义上与verilog标准保持了一致,抽象出了一个新的队列b,用于处理当前时刻某些值的更新,所触发的新的需要执行的事件。将verilog标准中的active事件队列又细分为了两个队列,队列a和队列b,在保证语义一致的前提下,使用了与verilog标准不一样的事件队列组织和调度方法,更容易使用编程语言实现。
    [0043]
    以上对本发明所提供的一种对verilog hdl进行行为仿真的方法进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

    技术特征:
    1.一种对verilog hdl进行行为仿真的方法,其特征在于,所述方法包括以下步骤:步骤s100:在与verilog保持语义和标准一致的前提下,将调度模型划分为每一时刻都有的5个事件队列,其中,队列a包括值计算、普通赋值语句值更新事件,队列b包括值更新引发的其他值的更新事件,队列c包括0延迟语句值更新事件,队列d包括非阻塞赋值值更新事件队列,队列e包括系统函数监控事件;步骤s200:获取当前仿真时刻的5个事件队列,检测队列a是否为空,若所述队列a不为空,则依次执行所述队列a中事件的处理函数;步骤s300:检查队列b是否为空,如果所述队列b不为空,依次执行所述队列b中事件的处理函数;步骤s400:检查队列c是否为空,如果所述队列c不为空,依次执行所述队列c中事件的处理函数;步骤s500:检查所述队列b是否为空,如果所述队列b为空,检查队列d是否为空,如果所述队列d不为空,依次执行所述队列d中事件的处理函数;步骤s600:检查所述队列b是否为空,如果所述队列b为空,检查所述队列d是否为空,如果所述队列d为空,检查是否触发了系统函数,如果触发了,依次执行队列e被触发的系统函数,完成当前仿真时刻的事件队列,取下一个仿真时刻的事件队列作为当前时刻的仿真事件队列,并返回步骤s200,直至仿真结束,退出程序。2.根据权利要求1中所述的方法,其特征在于,步骤s200还包括:若所述队列a为空,检查队列d是否为空,若所述队列d为空,则仿真结束,退出程序;若所述队列d不为空,依次执行队列d中事件的处理函数。3.根据权利要求2中所述的方法,其特征在于,步骤s300还包括:如果所述队列b为空,执行步骤s400。4.根据权利要求3中所述的方法,其特征在于,步骤s400还包括:如果所述队列c为空,执行步骤s500中检查队列d是否为空的步骤。5.根据权利要求4中所述的方法,其特征在于,步骤s500还包括:如果所述队列d为空,则执行步骤s600中检查是否触发了系统函数的步骤。6.根据权利要求5中所述的方法,其特征在于,步骤s200之前还包括:初始化内存和0时刻的事件队列。

    技术总结
    本发明公开了一种对Verilog HDL进行行为仿真的方法,包括获取当前仿真时刻的5个事件队列,检测队列A是否为空,若不为空,依次执行队列A中事件的处理函数;检查队列B是否为空,如果不为空,依次执行队列B中事件的处理函数;检查队列C是否为空,如果不为空,依次执行队列C中事件的处理函数;检查队列B是否为空,如果为空,检查队列D是否为空,如果不为空,依次执行队列D中事件的处理函数;检查队列B是否为空,如果为空,检查队列D是否为空,如果为空,检查是否触发了系统函数,如果触发了,依次执行队列E被触发的系统函数,完成当前仿真时刻的队列。在保证与verilog标准语义一致的前提下,更容易使用编程语言实现。更容易使用编程语言实现。更容易使用编程语言实现。


    技术研发人员:王彦鹏 李立 谢辉
    受保护的技术使用者:湖南泛联新安信息科技有限公司
    技术研发日:2022.04.22
    技术公布日:2022/5/25
    转载请注明原文地址:https://tc.8miu.com/read-8536.html

    最新回复(0)