完美者(wmzhe.com)网站以软件下载为基础,改版后的网站对功能性板块进行扩充,以期能够解决用户在软件使用过程中遇见的所有问题。网站新增了“软件百科”、“锦囊妙技”等频道,可以更好地对用户的软件使用全周期进行更加专业地服务。
SVEditor是款以Eclipse为基础的SystemVerilog文件编辑器,它可以帮助开发者进行Verilog和SystemVerilog文件的创建、编辑,SVEditor提供了可视化的编辑操作界面,可以用于设计电子系统以及验证模拟、混合信号等,且用户还可以通过Eclipse Marketplace将SVEditor与现有的Eclipse IDE集成。
"锦囊妙技"栏目是聚合全网软件使用的技巧或者软件使用过程中各种问题的解答类文章,栏目设立伊始,小编欢迎各路软件大神朋友们踊跃投稿,在完美者平台分享大家的独门技巧。
本站文章素材来源于网络,大部分文章作者名称佚失,为了更利于用户阅读和使用,根据需要进行了重新排版和部分改编,本站收录文章只是以帮助用户解决实际问题为目的,如有版权问题请联系小编修改或删除,谢谢合作。
软件大小:14.33 MB
网上有些例子只给了简单的print,文档里也只有在module中调用c,c中用module的函数,不能充分说明问题。既然希望在C里调用C++的函数,那么肯定要能访问到C++类里的变量那才有意义。这里给出一个简单的例子,示例代码如下: 调用关系: top call sv_print(); top call c_print(); c_print() call c_print_call(); c_print() call cpp_print(); // top.v module top; string s; c_sv sv_inst; import "DPI-C" function void c_print(input string s); initial begin s = "Hello DPI"; sv_inst = new(); sv_inst.sv_print(s); c_print(s); end endmodule [cpp] view plain copy //c_dpi.c void c_print(const char* s) { c_print_call(s); cpp_print(s); } [cpp] view plain copy //c_dpi_call.c #include <stdio.h> void c_print_call(const char* s) { printf("C:\t%0s\n", s); } [cpp] view plain copy //cpp_dpi.cpp #include <stdio.h> #include <iostream> #ifdef __cplusplus extern "C" { #endif class c_cpp{ public: c_cpp(); ~c_cpp(); char* get_string(); private: char* prefix; }; void cpp_print(char* s); #ifdef __cplusplus } #endif using namespace std; c_cpp::c_cpp() { prefix = "CPP:\t"; } c_cpp::~c_cpp(){ } char* c_cpp::get_string(){ return prefix; } void cpp_print(char* s) { c_cpp inst; char* prefix; prefix = inst.get_string(); cout << prefix << s << endl; } [cpp] view plain copy //sv_dpi.sv class c_sv; function new(); endfunction : new function void sv_print(string s); $display("SV:\t%0s", s); endfunction : sv_print endclass
以产生受约束的随机激励是sv验证语言中最主要的feature,这里有一个常常会被验证工程师忽视的问题,就是随机化种子(seed)。 我们知道,用verilog里面的$random或者sv里面的$urandom产生的都只是伪随机数,也就是说,如果不改变seed,每次仿真产生的随机数都一样。 sv的受约束的随机化方法与上述情况其实也有点相同。sv中,每个对象维持自身的内部RNG,排他地用于randomize()方法,这使得对象的随机化保持各自独立。当生成对象时,创建它的线程的RNG的下一个值被用于设置成它的RNG的随机化种子。此时对象的new函数()默认的seed为1,如果不改变seed的值,则每次run仿真时,仍旧会产生相同的激励数据。 因此,我们需要手动设置new()函数中的随机化seed,使得每次run仿真时可以得到真正意义上的随机激励。 手动设置对象RNG的随机化seed的方法是:使用srandom()将种子传给随机的变量seed,这能确保在任意类成员变量被randomize之前,为对象的RNG设置新的随机化seed。举例如下: 1 class Packet; 2 rand bit[15:0] header; 3 ... 4 function new (int seed); 5 this.srandom(seed); 6 ... 7 endfunction 8 endclass 这样,我们便从外部对RNG设置新的随机化seed了: 1 Packet p = new(200); //create p with seed 200. 2 p.srandom(300); //re-seed p with seed 300. 实际代码中,我们可以将seed宏定义为不同的值,还可以使用系统时间作为seed,我们先定义变量seed: 1 module test ; 2 integer seed ; 3 initial begin 4 if(!$value$plusargs("seed=%d",seed)) 5 seed = 10 ; 6 ... 7 end 8 endmodule 使用仿真命令即可将系统时间作为seed: vcs -R test.v +plusargs_save +seed=`date +%N 另外一种经常用到的方法是只需在仿真命令中加入+ntb_random_seed_automatic,代码中不需要出现变量seed,只需要有随机约束: 1 `timescale 1ns/1ns 2 program test ; 3 integer i ; 4 class rc ; 5 rand int a ; 6 constraint con {a >0;} 7 endclass 8 9 initial begin 10 rc ua = new(); 11 for(i=0;i<10;i++) begin 12 ua.randomize(); 13 $display("%d",ua.a); 14 end 15 $display("%d",$urandom); 16 end 17 endprogram 仿真命令如下: vcs -sverilog -R test.sv +plusarg_save +ntb_random_seed_automatic
Eclipse中的SVEditor插件,支持SystemVerilog, Verilog和VHDL,勾选插件设置中的保存时格式化代码,每次保存都会格式化代码。
很多软件都可以编译,vcs和quartus都可以,ise没试过。modelsim只是查看波形的工具