如何使用DPI-C嵌入Systemverilog Interpreter?

问题描述

我在SystemVerilog中设计并使用相同的语言编写测试平台。 我希望能够在模拟过程中编译我的设计和测试不同的function,就像你使用e的解释器一样。 理想情况下,当模拟器撞到某条线时,我会在模拟时弹出一个终端弹出窗口。

潜在的想法

我看过DPI-C,似乎我必须“导出”项目中的所有任务才能从解释器运行它们。 但是,我不确定如何自动执行此操作或者是否有更好的方法。 此外,我不知道如何让C为我打开第二个shell来输入SystemVerilog(我想要运行)。

这是一个问题与我的同事相呼应,并且在编译一个测试平台之间不必等待10分钟会让生活变得更加痛苦。

嗨我用另一个例子提供我的两分钱。

示例SV-CODE

//////////////////////////////////////////////////////////////////////// //IMPORT FUNCTION DPI DECLARATION FROM C //////////////////////////////////////////////////////////////////////// import "DPI-C" function void python_sign_msg(string key_file_name, string msg_file_name, string signed_file_name ); import "DPI-C" function string return_string_in_c(string text, inout string output_txt); typedef class keycontrol_seq_handles; //----------------------- class keycontrol_predictor#(int PARAM_PLACEHOLDER = 1) extends pve_predictor#(keycontrol_seq_handles);//extends uvm_component; ……….. ////////////////////// //USE OF DPI ////////////////////// string output_c,output2_c; output_c = return_string_in_c("This text",output2_c); python_sign_msg("file.txt","bla","blo"); endclass 

最好的选择是使用DPI和某种脚本语言进行测试。 例如,我已经看到了这项工作:Python – > Boost.Python – > C ++ – > DPI – > Verilog / SystemVerilog

它确实限制了你在测试中可以做的事情(将它作为两种语言之间的TLM接口,即只在它们之间来回传递事务),但实际上这通常会迫使你使用好的抽象实践。 阅读Python中的“yield”,了解如何在python和模拟器之间来回传递控制。

怎么样去模拟器的交互式命令行终端。 这不是典型的shell终端,例如unix。 它是与模拟器绑定的供应商特定交互模式。 在大多数情况下,它是由Verilog的$stop触发的。 它是特定于供应商的,因此您需要参考手册中的所有function,有些function允许调用Verilog / SystemVerilog中定义的任务和function。

听起来你不需要在一次模拟中运行所有条件。 编译一次并运行许多策略应该适用于您的情况。 SystemVerilog系统函数$test$plusargs$value$plusargs可以检测用于启动模拟的参数。 请参阅IEEE Std1800-2012§21.6 命令行输入

 // ... int testid; // ... initial begin // ... if(!$value$pluseargs("TESTID=%d",testid)) begin // code if +TESTID= is not an argument end case(testid) 0 : run_task_test0(/*...*/); 1 : run_task_test1(/*...*/); 2 : run_task_test2(/*...*/); 3 : run_task_test3(/*...*/); // ... endcase // ... end 

然后编译一次并根据需要多次启动模拟。

 % [compile-cmd] % [sim-cmd] +TESTID=0 % [sim-cmd] +TESTID=3 % [sim-cmd] +TESTID=1 % [sim-cmd] +TESTID=2