由于项目需要,现在编写了一个systemc的reference model要加入到一个systemverilog的uvm框架里面去。

现在碰到的问题是systemc这边的model是以线程的模式持续运行的,而不是发一个input package给一个output package的模式,因此需要实现:

  1. 整体框架运行在sv中,使用vcs仿真器

  2. 同时拉起一个sc线程和一个sv线程

  3. sv的线程可以控制sc线程中的一个锁的上锁和解锁

经过一番实验后完成的demo如下:

sc代码:

#include "systemc.h"
#include "svdpi.h"
#include "svdpi_src.h"
#include <unistd.h>
#include <iostream> using namespace std; extern "C" {
void wait_for_time(int delay_time);
bool get_lock();
} SC_MODULE(ThreadExample) {
SC_CTOR(ThreadExample) {
SC_THREAD(thread_func);
} void thread_func() { while (true) {
cout << "systemc thread running" << endl;
wait_for_time(5);
while(get_lock())
wait_for_time(1);
}
}
}; extern "C" { void echo(char* str) {
printf("%s\n",str);
} int sc_main(int argc, char* argv[]) {
ThreadExample thread_example("ThreadExample");
cout << "thread crearted" << endl;
sc_start();
return 0;
} void sc_main_wrapper(int argc, svOpenArrayHandle argv) {
char* argv_main[argc];
for (int i = 0; i < argc; i++)
{
char ** p = (char **) svGetArrElemPtr(argv, i);
argv_main[i] = *p;
}
sc_main(argc, argv_main);
}
}

sv代码:

// tb.sv
module tb;
import "DPI-C" context task sc_main_wrapper(int argc, string argv[]);
import "DPI-C" function void echo(string str); export "DPI-C" task wait_for_time;
export "DPI-C" function get_lock; task wait_for_time(input int delay_time);
//$display("sc time is",$time);
repeat(delay_time) begin
#1;
end
endtask bit lock = 1; function bit get_lock();
return lock;
endfunction string argv[5]; initial begin
argv[0] = "./uvm";
argv[1] = "-f";
argv[2] = "../../../sw/project/build/rvcim.hex";
argv[3] = "-R";
argv[4] = "32"; fork
begin
while (1) begin
$display("sv thread1 running");
$display("sv time is",$time);
lock = ~lock;
$display("lock is ",lock);
#10;
end
end
begin
sc_main_wrapper(5, argv);
end
join_none
end
endmodule

执行结果(截取部分):

sv thread1 running
sv time is 378240
lock is 0
systemc thread running
systemc thread running
sv thread1 running
sv time is 378250
lock is 1
sv thread1 running
sv time is 378260
lock is 0
systemc thread running
systemc thread running
sv thread1 running
sv time is 378270
lock is 1
sv thread1 running
sv time is 378280
lock is 0
systemc thread running
systemc thread running
sv thread1 running
sv time is 378290
lock is 1
sv thread1 running
sv time is 378300
lock is 0
systemc thread running
systemc thread running
sv thread1 running
sv time is 378310
lock is 1
sv thread1 running
sv time is 378320
lock is 0
systemc thread running
systemc thread running
sv thread1 running
sv time is 378330

可以看到运行状态符合预期。

之前碰到的一个问题是,如果在sc线程上锁后等待的while里面不加延时的话,那么整个仿真时间无法再前进,从而sv线程也无法执行到解锁,因此sc线程无法解锁也会一直卡死,最后两个线程一起进入死锁这样一个状态。所以通过给while里面增加一个延时就可以巧妙的解决掉这个问题了。

一个SystemC线程与SystemVerilog线程通信的例子的更多相关文章

  1. 一个 Java 的 Socket 服务器和客户端通信的例子

    一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请 ...

  2. C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别

    C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye    { //私有的构造函数,保证外部不能实例化        private  ...

  3. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  4. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  5. 新建线程与UI线程间的通信

    现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入 ...

  6. Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

    一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...

  7. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  8. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  9. 如何停止一个正在运行的java线程

    与此问题相关的内容主要涉及三部分:已废弃的Thread.stop().迷惑的thread.interrupt系列.最佳实践Shared Variable. 已废弃的Thread.stop() @Dep ...

  10. Qt QThread 线程创建,线程同步,线程通信 实例

    1.  继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...

随机推荐

  1. 双系统,使用archinstall安装系统后,启动选项里面没有Arch Linux的解决方法

    在硬盘上已有一个Windows系统,再去手动分区安装Arch Linux,使用archinstall划分好磁盘且指定已有的ESP分区为boot分区(UEFI),安装系统后,启动选项里面没有Arch L ...

  2. 前端开发系列026-基础篇之Canvas绘图(曲线)

    本文将介绍Canvas中的弧度.曲线.圆弧以及文字的绘制方法以及径向渐变等内容,并提供饼状图等综合案例. 一.Canvas中的弧度.曲线和圆弧 专业术语 夹角 从一个点发射(延伸)出两条线段,两条线相 ...

  3. Codeforces Round #665 (Div. 2) ABC题解

    A. Distance and Axis 题意:给出OX坐标上OA的长度,每次可以将A移动一个单位,问最少多少次可以找出坐标B的整数解使得 | OB - AB | = k. 思路:分类讨论. 1.若B ...

  4. opengl 学习 之 09 lesson

    opengl 学习 之 09 lesson 简介 顶点序列化? 思想简单来说,就是如果近似的点,使用同一个点,如果不是近似的点就增加点. link http://www.opengl-tutorial ...

  5. java 拖拽矩形

    简介 java 拖拽矩形 code import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.ut ...

  6. ICEE-Power-功率半导体: Si MOSFET、IGBT和SiC MOSFET栅极驱动器 + Insulating Gate Drving栅极隔离驱动

    https://view.inews.qq.com/k/20220217A01CMH00 IGBT 和 SiC 电源开关有哪些市场和应用? 高效的电源转换在很大程度上由系统使用的功率半导体器件确定. ...

  7. 实用Linux命令记录

    ss统计网络连接情况 [root@Dev-8.8.8.8 ~]# ss -tan |awk 'NR>1 {++sum[$1]} END{for(i in sum) print i"\t ...

  8. tauri学习(4)-多窗口

    接上节继续,今天研究tauri中的多窗口,要实现多窗口有几种方式: 一.改配置tauri.conf.json 仍然以react项目模式为例,假设我们有2个页面效果: 在浏览器中运行起来长这样: tau ...

  9. 2023年10月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojson json

    发现个可以免费下载全国 geojson 数据的网站,推荐一下.支持全国.省级.市级.区/县级.街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3.Echarts等 geojso ...

  10. unity Addressable Asset

    需要自己在Package manager添加Addressable包 使用方法:https://www.jianshu.com/p/e79b2eef97bf