使用VHDL或Verilog进行硬件设计更像是现在的编程.但是,我看到SO成员并没有那么积极地谈论VHDL/Verilog编程.
有没有关于使用Verilog/VHDL/SystemVerilog或SystemC处理硬件设计的论坛?
我正在SystemC的一个项目上工作,并希望结合单元测试.是否可以将现有的单元测试框架与SystemC一起使用?
我问这个是因为看起来SystemC模块只能用模拟内核执行,我想在模块本身上使用单元测试.
我正在努力研究将执行程序的状态存储到磁盘并将其重新引入的基本原则.在我们当前的设计中,每个对象(具有函数指针列表的C级事物,低级自制的面向对象 - 以及这样做的非常好的理由)将是调用将其显式状态导出为可写和可恢复的格式.使这项工作的关键属性是与对象相关的所有状态确实封装在对象数据结构中.
还有其他解决方案,您可以使用活动对象,其中有一些用户级线程附加到某些对象.因此,程序计数器,寄存器内容和堆栈内容突然成为程序状态的一部分.据我所知,没有什么好方法可以在任意时间点将这些东西序列化到磁盘上.线程必须将其自身停放在一些特殊状态,其中程序计数器等没有任何表示,因此基本上将它们的执行状态机状态"保存"到显式对象状态.
我查看了一系列序列化库,据我所知,这是一个通用属性.
核心问题是:或者这实际上不是这样吗?是否存在可以包含线程状态的保存/恢复解决方案,就其代码中的线程执行位置而言?
请注意,在虚拟机中保存整个系统状态不会计算,这不是真正序列化状态,而只是冻结计算机并移动它.这是一个明显的解决方案,但大多数时候都有点重量级.
有些问题清楚表明,我在解释我们如何做事的想法时并不够清楚.我们正在开发一个模拟器系统,允许编写非常严格的内部代码运行规则.特别是,我们在对象构造和对象状态之间进行了完全划分.每次设置系统时都会重新创建接口函数指针,而不是状态的一部分.状态仅由特定的指定"属性"组成,每个属性具有定义的get/set函数,该函数在内部运行时表示和存储表示之间进行转换.对于对象之间的指针,它们都被转换为名称.所以在我们的设计中,一个对象可能会在存储中出现:
Object foo {
value1: 0xff00ff00;
value2: 0x00ffeedd;
next_guy_in_chain: bar;
}
Object bar {
next_guy_in_chain: null;
}
Run Code Online (Sandbox Code Playgroud)
链接列表从未真正存在于模拟结构中,每个对象代表某种硬件单元.
问题是有些人想要这样做,但也有线程作为编码行为的方式.这里的"行为"实际上是模拟单元状态的变异.基本上,我们所设计的设计说,所有这些变化都必须在原子完整的操作中进行,这些操作被调用,完成它们的工作并返回.所有状态都存储在对象中.您有一个被动模型,或者它可以被称为"运行到完成"或"事件驱动".
另一种思考方式是让对象具有活动线程,它们以与传统Unix线程相同的方式处于永久循环中,并且永不终止.这是我试图看看它是否可以合理地存储到磁盘的情况,但是如果没有在下面插入VM,这似乎是不可行的.
更新,2009年10月:与此相关的论文发表在2009年的FDL会议上,参见本文关于检查点和SystemC.
我尝试使用我在SystemC网站上找到的一个示例来测试我的环境(这个).这是示例的代码:
#include "scv.h"
const unsigned ram_size = 256;
class rw_task_if : virtual public sc_interface {
public:
typedef sc_uint<8> addr_t;
typedef sc_uint<8> data_t;
struct write_t {
addr_t addr;
data_t data;
};
virtual data_t read(const addr_t*) = 0;
virtual void write(const write_t*) = 0;
};
SCV_EXTENSIONS(rw_task_if::write_t) {
public:
scv_extensions<rw_task_if::addr_t> addr;
scv_extensions<rw_task_if::data_t> data;
SCV_EXTENSIONS_CTOR(rw_task_if::write_t) {
SCV_FIELD(addr);
SCV_FIELD(data);
}
};
class pipelined_bus_ports : public sc_module {
public:
sc_in< bool > clk;
sc_inout< bool > rw;
sc_inout< bool > addr_req;
sc_inout< bool > …
Run Code Online (Sandbox Code Playgroud) 当我创建一个实例时,如果sc_module
我给它一个字符串作为模块名称(sc_module_name
).
如何获取当前正在运行的模块的名称?
我有一个SystemC模块如下所示,我想将"maps"传递给构造函数.我该怎么做?
struct Detector: sc_module
{
map <int,int> int_map;
SC_CTOR(Detector)
{
for (int i = 0 ; i<10; i++)
{
int_map[i]= map[i][0];
}
}
};
Run Code Online (Sandbox Code Playgroud)
例如,我想用4个不同的地图实例化这个模块4次.
这是我的计划:
#include <systemc.h>
int sc_main(int argc, char* argv[])
{
sc_signal<sc_logic> a, b, c, d;
// trace file creation
sc_trace_file *tf = sc_create_vcd_trace_file("test");
//tf->set_time_unit(1, SC_PS);
sc_trace(tf, a, "A");
sc_trace(tf, b, "B");
sc_trace(tf, c, "C");
sc_trace(tf, d, "D");
sc_start(0, SC_PS);
bool a_tmp = false;
bool b_tmp = true;
int c_tmp = 0;
int d_tmp = 1;
a = sc_logic(a_tmp);
b = sc_logic(b_tmp);
c = sc_logic(c_tmp);
d = static_cast<sc_logic>(d_tmp);
sc_start(1, SC_PS);
a = SC_LOGIC_1; b = SC_LOGIC_1;
c = SC_LOGIC_0; d = SC_LOGIC_1; …
Run Code Online (Sandbox Code Playgroud) 我正在使用C++(Visual Studio 2015)调试大型应用程序上的"访问冲突"异常.该应用程序是由几个库构建的,其中一个(SystemC)会出现问题,尽管我怀疑问题的根源在其他地方.
m_update_phase = true;
m_prim_channel_registry->perform_update();
m_update_phase = false;
Run Code Online (Sandbox Code Playgroud)
inline
void
sc_prim_channel_registry::perform_update()
{
for( int i = m_update_last; i >= 0; -- i ) {
m_update_array[i]->perform_update();
}
m_update_last = -1;
}
Run Code Online (Sandbox Code Playgroud)
(这些是从摘录systemc\kernel\sc_simcontext.cpp
和systemc\communication\sc_prim_channel.h
,所述的部分SystemC的库)
通过上面的代码多次迭代后发生错误.调用m_prim_channel_registry->perform_update()
抛出0xC0000005: Access violation writing location 0x0F4CD9E9.
异常.
只有在Release配置中构建应用程序时才会发生这种情况
看看汇编代码,我看到函数sc_prim_channel_registry::perform_update()
是内联的,内部函数调用m_update_array[i]->perform_update()
似乎破坏了调用函数的堆栈框架.
当m_update_last = -1;
被执行时,与m_update_last不再指向有效的存储位置,并抛出异常.
(m_update_last
是类的一个简单的天然成员sc_prim_channel_registry
具有类型int
)
m_update_phase = true;
m_prim_channel_registry->perform_update();
1034D99E mov eax,dword ptr [esi+10h]
1034D9A1 …
Run Code Online (Sandbox Code Playgroud) 我有一些关于凿子转换的问题。我知道这是理论上的,但如果有人提出他的意见会很好。
1)想问为什么Chisel不注重VHDL/SystemVerilog的转换。虽然 Verilog 和 VHDL 是相同的,但在一些国家,尤其是欧洲,更喜欢 VHDL。2) 同样,C++模型用于仿真模型。为什么不是 SystemC 用于此目的?
我正在阅读一些笔记,发现 FIRRTL 是转换 CHISEL-->FIRRTL--> Verilog 和 CHISEL ---> FIRRTL--> C++ 模型的中间人。
使用(低)FIRRTL 规范转换 VHDL 和 SystemC 模型是个好主意吗?
我一直在阅读 Stack Overflow 上的这个 upvoted 答案:https ://stackoverflow.com/a/26129960/12311164
它说将wait(delay, units);
SC_THREAD替换为next_trigger(delay, units)
SC_METHOD 有效。
但是当我尝试时,它不起作用。我正在尝试构建具有 2 ns 输出延迟的加法器模块。加法器输出不是 2 ns 的输出延迟,而是每 2 ns 更新一次。
设计:
#include "systemc.h"
#define WIDTH 4
SC_MODULE(adder) {
sc_in<sc_uint<WIDTH> > A, B;
sc_out<sc_uint<WIDTH> > OUT;
void add(){
sc_time t1 = sc_time_stamp();
int current_time = t1.value();
int intermediate = A.read() + B.read();
next_trigger(2, SC_NS);
OUT.write(intermediate);
cout << " SC_METHOD add triggered at "<<sc_time_stamp() <<endl;
}
SC_CTOR(adder){
SC_METHOD(add);
sensitive << A << B;
}
};
Run Code Online (Sandbox Code Playgroud)
我知道如何使用 …