深圳如何搭建制作网站,个人网站空间准备,做微商推广有哪些好的分类信息网站,大连网站关键词排名文章目录 0 前言1 语法介绍2 示例3 多种情况的testbench怎么写 0 前言
这段时间在整合一个小ip#xff0c;因为要验证每个feature是否可行#xff0c;需要用testbench C语言的方式进行仿真验证#xff0c;由于每种feature不仅要在C语言中修改寄存器配置#xff0c;还要再… 文章目录 0 前言1 语法介绍2 示例3 多种情况的testbench怎么写 0 前言
这段时间在整合一个小ip因为要验证每个feature是否可行需要用testbench C语言的方式进行仿真验证由于每种feature不仅要在C语言中修改寄存器配置还要再testbench修改寄存器的配置这导致每验证一种feature既需要修改C语言也需要修改testbench非常繁琐
并且也不想把所有的feature写在一个testbench中仿真时间会变长很多尤其是需要dump波形的时候如果验证完一个feature后把调教好的testbench注释掉一番注释下来看着也恶心并且等所有feature都搞好后仿真的时间还是很长
于是就希望能有一种方式在验证不同的feature时可以吃不同的 testbench一番搜索下来找到了$test$plusargs的方法
1 语法介绍
先捋清两个词plusargs、plusargs_string
plusargs仿真时添加的参数plusargs_string编译时提供的字符串
上面提到两个词编译和仿真以vcs为例整个执行过程主要分为两步编译和仿真irun/xrun有三步编译、细化elaborate、仿真
编译的过程是检查语法、展开所有的参数、宏以及include的文件等等仿真的过程我的理解就是打入设定的激励验证功能是否符合预期
vcs成功编译后会生成一个可执行文件simv如下图 在执行simv即可进行仿真
开始介绍主角直接抄文档中的例子了
initial beginif ($test$plusargs(HELLO)) $display(Hello argument found.); if ($test$plusargs(HE)) $display(The HE subset string is detected.); if ($test$plusargs(H)) $display(Argument starting with H found.);if ($test$plusargs(HELLO_HERE))$display(Long argument.);if ($test$plusargs(HI)) $display(Simple greeting.);if ($test$plusargs(LO)) $display(Does not match.);
end在上面这段代码中$test$plusargs(HELLO)中的HELLO是plusargs_string也就是编译时提供的字符串编译完成后在进行仿真时执行simv不同的plusargs会打印不同的内容
只有当plusargs_string的内容完全匹配plusargs的部分或全部内容时$test$plusargs()会返回一个非0的整数
原文如下 原文的plusargs是HELLO并给出了执行结果 2 示例
做个实验测试一下代码如下
module tb;initial begin$display(*********************\n);if($test$plusargs(test))$display(\t test found \n);if($test$plusargs(test_pattern))$display(\t test_pattern found \n);if($test$plusargs(te))$display(\t te found \n);if($test$plusargs(taa))$display(\t taa found \n);$display(*********************\n);#10;$finish;endendmodule编译之后生成可执行文件 simv然后执行simv test 仿真结果如下 在上面的例子中只有test和te部分或全部匹配test因此只打印了这两个语句的内容
3 多种情况的testbench怎么写
就像开头说的情况我需要多种testbench如何借助这种方法实现呢思路如下
针对不同的情况写多份配置过程并保存在不同的文本中比如需要三种配置可以写三份文本并保存为test_1.sv, test_2.sv, test_3.sv在testbench中利用 t e s t test testplusargs include这三个文本
给出一个简单的模板
module tb;/* 此处省略tb中clk、dump等等内容 */initial beginif($test$plusargs(test_1))include ./test_1.sv;if($test$plusargs(test_2))include ./test_2.sv;if($test$plusargs(test_3))include ./test_3.sv;end
endmodule在仿真时通过不同的plusargs就可以执行不同testbench了