CN114528793A - 一种对Verilog HDL进行行为仿真的方法 - Google Patents
一种对Verilog HDL进行行为仿真的方法 Download PDFInfo
- Publication number
- CN114528793A CN114528793A CN202210427569.0A CN202210427569A CN114528793A CN 114528793 A CN114528793 A CN 114528793A CN 202210427569 A CN202210427569 A CN 202210427569A CN 114528793 A CN114528793 A CN 114528793A
- Authority
- CN
- China
- Prior art keywords
- queue
- empty
- checking whether
- events
- event
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/30—Circuit design
- G06F30/32—Circuit design at the digital level
- G06F30/33—Design verification, e.g. functional simulation or model checking
- G06F30/3308—Design verification, e.g. functional simulation or model checking using simulation
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明公开了一种对Verilog HDL进行行为仿真的方法,包括获取当前仿真时刻的5个事件队列,检测队列A是否为空,若不为空,依次执行队列A中事件的处理函数;检查队列B是否为空,如果不为空,依次执行队列B中事件的处理函数;检查队列C是否为空,如果不为空,依次执行队列C中事件的处理函数;检查队列B是否为空,如果为空,检查队列D是否为空,如果不为空,依次执行队列D中事件的处理函数;检查队列B是否为空,如果为空,检查队列D是否为空,如果为空,检查是否触发了系统函数,如果触发了,依次执行队列E被触发的系统函数,完成当前仿真时刻的队列。在保证与verilog标准语义一致的前提下,更容易使用编程语言实现。
Description
技术领域
本发明属于仿真领域,特别是涉及一种对Verilog HDL进行行为仿真的方法。
背景技术
在verilog标准中,所有的事件被分为了下面的5种:活动事件(Active Event)在当前的仿真事件产生,可以按任意顺序处理;非活动事件(Inactive Event)在当前仿真时间产生,但必须在所有活动事件处理完成之后再进行处理;非阻塞赋值更新事件(Nonblocking Assign Update Event)在之前的某个仿真时间已被计算,但在当前仿真时间,必须在所有活动事件和非活动事件处理完成之后,再进行赋值;监控事件(MonitorEvent)必须在所有活动,非活动,和非阻塞赋值更新事件之后处理;未来事件(FutureEvent)在未来某个仿真时间产生,未来事件分为未来非活动事件(Future InactiveEvent)和未来非阻塞赋值更新事件(Future Nonblocking Assignment Update Event)。
但是verilog标准中只给出来抽象模型,没有具体的实现的方法,因为亟需一种对Verilog HDL进行行为仿真的方法。
发明内容
针对以上技术问题,本发明提供一种对Verilog HDL进行行为仿真的方法。
本发明解决其技术问题采用的技术方案是:
一种对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,直至仿真结束,退出程序。
优选地,步骤S200还包括:若队列A为空,检查队列D是否为空,若队列D为空,则仿真结束,退出程序;若队列D不为空,依次执行队列D中事件的处理函数。
优选地,步骤S300还包括:如果队列B为空,执行步骤S400。
优选地,步骤S400还包括:如果队列C为空,执行步骤S500中检查队列D是否为空的步骤。
优选地,步骤S500还包括:如果队列D为空,则执行步骤S600中检查是否触发了系统函数的步骤。
优选地,步骤S200之前还包括:初始化内存和0时刻的事件队列。
上述一种对Verilog HDL进行行为仿真的方法,在保证与verilog标准语义一致的前提下,使用了与verilog标准不一样的事件队列组织和调度方法,更容易使用编程语言实现。
附图说明
图1为本发明一实施例中一种对Verilog HDL进行行为仿真的方法流程示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明的技术方案,下面结合附图对本发明作进一步的详细说明。
在一个实施例中,一种对Verilog HDL进行行为仿真的方法,方法包括以下步骤:
步骤S100:在与Verilog保持语义和标准一致的前提下,将调度模型划分为每一时刻都有的5个事件队列,其中,队列A包括值计算、普通赋值语句值更新事件,队列B包括值更新引发的其他值的更新事件,队列C包括0延迟语句值更新事件,队列D包括非阻塞赋值值更新事件队列,队列E包括系统函数监控事件。
具体地, 赋值语句有三种: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这两个系统函数。
步骤S200:获取当前仿真时刻的5个事件队列,检测队列A是否为空,若队列A不为空,则依次执行队列A中事件的处理函数。
在一个实施例中,步骤S200还包括:若队列A为空,检查队列D是否为空,若队列D为空,则仿真结束,退出程序;若队列D不为空,依次执行队列D中事件的处理函数。
在一个实施例中,步骤S200之前还包括:初始化内存和0时刻的事件队列。
步骤S300:检查队列B是否为空,如果队列B不为空,依次执行队列B中事件的处理函数。
在一个实施例中,步骤S300还包括:如果队列B为空,执行步骤S400。
步骤S400:检查队列C是否为空,如果队列C不为空,依次执行队列C中事件的处理函数。
在一个实施例中,步骤S400还包括:如果队列C为空,执行步骤S500中检查队列D是否为空的步骤。
步骤S500:检查队列B是否为空,如果队列B为空,检查队列D是否为空,如果队列D不为空,依次执行队列D中事件的处理函数;
在一个实施例中,步骤S500还包括:如果队列D为空,则执行步骤S600中检查是否触发了系统函数的步骤。
步骤S600:检查队列B是否为空,如果队列B为空,检查队列D是否为空,如果队列D为空,检查是否触发了系统函数,如果触发了,依次执行队列E被触发的系统函数,完成当前仿真时刻的事件队列,取下一个仿真时刻的事件队列作为当前时刻的仿真事件队列,并返回步骤S200,直至仿真结束,退出程序。
具体调度方法为:
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、仿真结束,退出程序。
具体调度流程图如图1所示。
如下verilog代码:
module demo;
reg a;
reg b;
wire [1:0]c;
initial begin
a = 0;
end
initial begin
b <= a;
end
initial begin
#0 a = 1;
end
initial begin
$monitor("a=%d, b=%d, c=%d", a, b, c);
end
assign c = a,;
endmodule
执行情况如下:
1、0时刻队列初始化后:
(1)队列A会有4个事件,分别对应于4个initial语句。
(2)队列B为空。
(3)队列C为空。
(4)队列D为空。
2、检查队列A是否为空,发现不为空,处理队列A:
(1)处理第一个事件,即会处理a=0语句:
①处理函数会将a的值更新为0;
②然后检查a的值是否发生了变化;
③发现a的值从x(未定值)变化到了0,即发生了改变,会调度被a影响的语句;
④因为assign语句对a的值敏感,所以会将assign语句调度到队列B中。
(2)处理第二个事件,即会处理b<=a语句:
①因为队列A只处理非阻塞赋值语句的值计算;
②所以只需要将此刻a的值(0)保存起来;
③然后将b的更新调度到队列D中。
(3)处理第三个事件,即会处理#0a=1语句:
①因为该语句是一个控制语句,所以会触发调度;
②所以会将a=1这个赋值语句加入到队列C中。
(4)处理第四个事件,即会处理$monitor语句:
①直接执行系统调用处理函数;
②处理函数中会将monitor标记置true,表明当前时刻需要触发monitor。
3、检查队列B是否为空,发现不为空,处理队列B:
(1)此时B队列只有一个事件,即assign语句;
(2)执行assign语句的处理函数,取出a的值(0),然后赋值给c。
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中。
5、检查队列B是否为空,发现不为空,处理队列B:
(1)此时B队列只有一个事件,即assign语句;
(2)执行assign语句的处理函数,取出a的值(1),然后赋值给c。
6、检查队列B是否为空,发现为空,则进一步检查队列C是否为空,发现队列C也为空。进一步检查队列D,发现队列D不为空,则处理队列D:
(1)此时队列D只有一个事件,即要用之前存起来的a的值(0)对b进行更新;
(2)更新b(此时b值为0);
7、检查队列B是否为空,发现为空,则进一步检查队列C是否为空,发现队列C也为空。进一步检查队列D,发现队列D也为空,则处理系统函数。
8、因为前面标记了此刻需要执行monitor函数,所以会执行队列E内的monitor系统函数。
9、跳转到下个仿真时刻。
10、发现队列都是空的,退出仿真程序。
上述一种对Verilog HDL进行行为仿真的方法,语义上与verilog标准保持了一致,抽象出了一个新的队列B,用于处理当前时刻某些值的更新,所触发的新的需要执行的事件。将verilog标准中的active事件队列又细分为了两个队列,队列A和队列B,在保证语义一致的前提下,使用了与verilog标准不一样的事件队列组织和调度方法,更容易使用编程语言实现。
以上对本发明所提供的一种对Verilog HDL进行行为仿真的方法进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
Claims (6)
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时刻的事件队列。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210427569.0A CN114528793B (zh) | 2022-04-22 | 2022-04-22 | 一种对Verilog HDL进行行为仿真的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210427569.0A CN114528793B (zh) | 2022-04-22 | 2022-04-22 | 一种对Verilog HDL进行行为仿真的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114528793A true CN114528793A (zh) | 2022-05-24 |
CN114528793B CN114528793B (zh) | 2022-07-01 |
Family
ID=81628263
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210427569.0A Active CN114528793B (zh) | 2022-04-22 | 2022-04-22 | 一种对Verilog HDL进行行为仿真的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114528793B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070033551A1 (en) * | 2005-01-27 | 2007-02-08 | Tenison Technology Eda Limited | Method for simulating hardware |
US20090164198A1 (en) * | 2007-12-20 | 2009-06-25 | Mentor Graphics Corp. | Parallel simulation using an ordered priority of event regions |
US20150356219A1 (en) * | 2014-06-06 | 2015-12-10 | Synopsys, Inc. | Efficient mechanism in hardware and software co-simulation system |
CN113095022A (zh) * | 2021-04-22 | 2021-07-09 | 国微集团(深圳)有限公司 | 门级电路的并行仿真处理方法、计算机可读存储介质 |
CN113343629A (zh) * | 2021-06-25 | 2021-09-03 | 海光信息技术股份有限公司 | 集成电路验证方法、代码生成方法、系统、设备和介质 |
-
2022
- 2022-04-22 CN CN202210427569.0A patent/CN114528793B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070033551A1 (en) * | 2005-01-27 | 2007-02-08 | Tenison Technology Eda Limited | Method for simulating hardware |
US20090164198A1 (en) * | 2007-12-20 | 2009-06-25 | Mentor Graphics Corp. | Parallel simulation using an ordered priority of event regions |
US20150356219A1 (en) * | 2014-06-06 | 2015-12-10 | Synopsys, Inc. | Efficient mechanism in hardware and software co-simulation system |
CN113095022A (zh) * | 2021-04-22 | 2021-07-09 | 国微集团(深圳)有限公司 | 门级电路的并行仿真处理方法、计算机可读存储介质 |
CN113343629A (zh) * | 2021-06-25 | 2021-09-03 | 海光信息技术股份有限公司 | 集成电路验证方法、代码生成方法、系统、设备和介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114528793B (zh) | 2022-07-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7451447B1 (en) | Method, computer program and apparatus for operating system dynamic event management and task scheduling using function calls | |
JP3801630B2 (ja) | 車両における内燃機関に対する燃料噴射制御方法 | |
US11568129B2 (en) | Spreadsheet recalculation algorithm for directed acyclic graph processing | |
US20040255296A1 (en) | Time-bounded program execution | |
JPH10207918A (ja) | デジタル・システム・シミュレーション | |
JP2003044295A (ja) | スリープキュー管理 | |
JP2003044296A (ja) | 実行キュー管理 | |
US10271326B2 (en) | Scheduling function calls | |
CN112199170A (zh) | 实时操作系统的定时处理方法、装置、设备及存储介质 | |
JP4241462B2 (ja) | 制御ユニットおよびマイクロコンピュータ | |
CN111400016B (zh) | 一种调用应用程序接口函数的方法和设备 | |
CN113495780A (zh) | 任务调度方法、装置、存储介质及电子设备 | |
JP4973095B2 (ja) | Cadデータのロード装置 | |
CN114625108B (zh) | 一种仿真测试方法及装置 | |
CN113126924A (zh) | 一种数据迁移方法、装置、设备及计算机可读存储介质 | |
CN114528793B (zh) | 一种对Verilog HDL进行行为仿真的方法 | |
CN112997152A (zh) | 应用程序的优先级调整方法、装置、存储介质及电子设备 | |
CN106650323A (zh) | 一种应用程序管理方法及装置 | |
KR100981017B1 (ko) | 정적 태스크 정의 기능을 가진 시스템을 위한 우선순위 재정의 및 대기큐 관리 방법과 상기 방법을 실행하는 시스템 | |
CN116302558A (zh) | 线程调度方法、装置及电子设备 | |
Quinton et al. | Formal analysis of sporadic bursts in real-time systems | |
CN113056756A (zh) | 睡眠识别方法、装置、存储介质及电子设备 | |
JPH10135096A (ja) | 半導体製造におけるスケジューリング方法 | |
CN107273191B (zh) | 一种使用逻辑克隆表达式的定时任务调度的方法及装置 | |
CN115688893B (zh) | 内存调度方法及装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |