Verdi用法小结

路科验证 2023-02-09 12:08

前言

Verdi是一个功能强大的debug工具,可以配合不同的仿真软件进行debug,很多企业常用VCS+Verdi或者Xcelium/xrun+Verdi的方式进行代码的仿真与检查。Verdi支持对所有设计和验证流程进行全面的调试。它能够帮助工程师理解复杂和不熟悉的设计行为,让困难和乏味的调试过程自动化,并能让多样和复杂的设计环境一致化。在芯片设计过程中,可以根据仿真结果检查或者理解设计;在芯片验证过程中,常常用来调试(debug)一些错误的情况。Verdi既可以阅读调试代码,又可以查看波形,包括数字设计的波形和模拟设计的波形

本文内容标题截图

本文一共一万一千多字,上百张截图,基本涵盖了Verdi的日常用法和常规技巧,内容比较多我对标题做了如下的截图,方便大家阅读查找。整理的过程中参考了很多大佬的文章,文末也都一一列举出来了。由于时间仓促,整理的还不是太理想,还是希望能帮助到一些朋友吧。

一、verdi使用教程

(一) Verdi环境配置

bashrc中配置

export Verdi_HOME=$Synopsys_Dir/Verdi2015#export NOVAS_HOME=$Synopsys_Dir/Verdi2015export PATH=$Verdi_HOME/bin:$PATHexport LD_LIBRARY_PATH="/opt/Synopsys/Verdi2015/share/PLI/lib/linux64"$PATHexport LD_LIBRARY_PATH="/opt/Synopsys/Verdi2015/share/PLI/VCS/linux64"$PATH
上面三个环境变量的解释:
VERDI_HOME/NOVAS_HOME:仿真器默认,且为设置PATH做准备
PATH:让系统(Linux)找到verdi
LD_LIBRARY_PATH:让系统(Linux)能够找到Verdi需要的库文件.so(静态库),.a(动态库),.tab(表格文件).

(二)VCS产生Verdi波形

[1]使用Verilog系统函数,tb文件中加入相应的系统函数

initial begin$fsdbDumpfile("fifo.fsdb");$fsdbDumpvars(0);end

[2] 使用UCLITCL接口(VCS使用tcl脚本)

global envfsdbDumpfile "$env(demo_fifo).fsdb"fsdbDumpvars 0 "top_tb"run

(三) Verdi基础使用

1 打开Verdi

(1)verdi -nologo

(2)makefile命令

2. nTrace使用

(1)查看包含的设计架构

(2)查寻模块实例化的位置

在设计结构中双击实例化模块的名字->源代码窗口高亮了模块名
②再双击高亮的模块名->看到在上层模块中的哪一行被调用了

在nTrace中查找模块和信号

查寻字符串

查看驱动信号相关

  

(3) nSchema使用

查看原理图

显示原理图各信号名

RTL:在当前的层次中查找某个信号

使用Fan-In Cone追踪某个信号的驱动逻辑

首先要用上面的办法来查找信号调用该工具:

产生partial hierarchy schematic

用来查看与选择特定信号有关的逻辑/模块
①选择需要查看的信号(可以通过shift键来选择多个信号)

(4) nState使用

查看状态机视图

查看状态的执行语句和转移条件

查看某个状态的执行次数


(5) nWave使用
[1] 添加波形到nWave

①我们要打开.v文件
②打开nWave然后打开.fsdb波形文件③正式添加波形:
快捷键G或者:

nTrace中选中信号后,鼠标中键拖拽,或者ctrl+w进行添加

自动加载,-ssf 命令

verdi -sv -f filelist.f -top tb_top -ssf dut.fsdb &

[2] 查找某信号,添加到nWave中

①通过nTrave查找到该信号②通过上面的方法进行添加或者通过get signal来查找

nWave波形窗口,快捷键 g 加载信号(Get signals)。在弹出的窗口选中需要添加的信号,点击滚轮选择需要添加信号的位置,也可在代码中(nTrac界面)选中信号 Ctrl+W 将信号加载在波形中

[2--]查找信号

找到模块里的某个信号,按?弹出find string对话框进行查找。

[3] 给Group重命名,排序,以及调整信号位置

[1]重命名

[2]信号的拖拽:通过鼠标中键进行拖拽。

[3]缩小:快捷键z,或者100%匹配:F

[4]放大:左键拖选放大范围shift+Z  ctrl+滑轮:进行放大或者缩小

[5]移动:鼠标中键按住信号拖拽中键选择位置:

[6]复制:ctrl+P,或者右击信号,选择复制的选项

[7]粘贴:ins键,或者右击信号,选择粘贴的选项(注意:可以通过鼠标中键选择粘贴的位置)

[8]删除:delete

[4] 改变信号的颜色

第一步:Tools->preferences->waveform->viewoption->waveformpane->general->paint waveform with specified color/pattern

第二步:选中信号,然后按快捷键C改变信号颜色。

C或者T修改信号或者波形颜色,T更实用,每按一次颜色自动改变。不区分大小写。

[5] 查看信号及变化

任意值:所有信号变化,一般会应用到组合逻辑的指示信号信号沿:用于查找有效指示信号,比如使能信号总线值:主要是用来查找数据信号模拟值:查看比如函数发生器产生的正弦波信号进制之间的转换:

[6] 进制之间的转换

[7] 符号数之间的转换

[8] 状态寄存器显示为状态名字

nTrace

或者nWave

[9] 通过移除关联,从状态机名字恢复到原来的进制显示

可以看到,我们打开过状态机视图之后,我们也就可以在状态名和进制之间转换了:

[10] 通过逻辑操作创建新信号

[11] 如何添加marker

shift+M。为方便波形定位,按键shift+M使用mark功能标记一下,可以自定义名称和颜色,方便查找。

[12] 总线操作:


[13] 如何查找信号的某个值、某个值跳转到某个值

[14] 如何对比两个波形


[15] 显示信号全路径

 H 显示波形信号全路径,再按H撤销。不区分大小写。

[16] 对信号的简单操作

点击波形窗口,选中信号,使用Delete删除信号。选中信号,使用Ctrl+p复制选中的信号,然后使用insert按键插入,粘贴的位置由黄线所在位置决定。

[17] 移动波形窗口信号的位置

使用滚轮在波形窗口选中信号,然后拖到代码窗口即可查看选中波形的代码逻辑

[18] 放大缩小

Z:Zoom In;z:Zoom Out;f:Zoom All

[19] 显示状态机的跳转

选中状态机状态的波形,在nWave窗口选中Tools>Bus Contention>打开状态机,(关闭),返回查看波形已经变为状态的名称。补充:选择具有状态机的模块选中,然后在主工具栏选择Tools>Extract interative FSM

点击OK,然后点击下面的状态机,即可看到状态的跳转。

[20] 参考信号数值

选中Source>Active Annotation即可看到每一个信号,参数的数据显示。

[21] 新建组并对组重命名

将黄线放到最后一行,添加信号即可新建一个信号组。然后鼠标选中右键即可进行相关操作,也可以选中一个模块,直接Ctrl+4即可将接口信号加入波形窗口。

[22] Signal Event Report统计

统计出某个信号在特定时间段内的跳变的次数。

按鼠标滑轮中建,添加一条mark标记线用于选择统计区间。

View -> Signal Event Report

Rising:指的是指定Marker时间段内上升沿数;
Falling:指的是指定Marker时间段内下降沿数;
备注:利用Logical Operation和Signal Event Report可以统计非连续有效信号

[23] Waveform Compare比较波形

nWave提供了一种综合比较自动比较不同结果的能力。在比较完成后,nWave以图形方式显示波形窗格中的任何不匹配,然后可以通过每个不匹配来分析差异。
Tools -> Waveform Compare


(四) Verdi使用技巧

1、连续信号有效数量的测量

[1] 下面分享一些在实际做项目过程中verdi在debug时的小技巧:连续信号有效数量的测量。

如下图所示,clk是输入时钟信号,data_enable_in是输入数据有效标志信号,y_in则是输入数据。在debug的时候,有时我们想要知道白色光标和黄色光标时间内有多少个连续有效的数据y_in。我们该如何做到呢?

一般可以使用以下3种方法:

方法1:最直接也是最笨的办法,当然是手动去数,1、2、3…;如果该时间段内,数据量较少,很快就可以数出来了。当数据量较多时,只要你有足够的耐心和时间,有时还需要一副好眼睛,最终也是可以得到正确的结果。不过效率非常低下,比较麻烦的是还容易数错。

方法2:如果已知时钟周期(本例子中clkp=6.736ns),则可以计算该时间段内时钟个数来获知数据量;上面例子的图中两个光标之间的时间差delta=188.608ns,delta/T=28,因此就是28个数据了。是不是要比直接用手动数快很多了?这个办法虽然准确,但是每次都要计算一次,如果需要频繁的获知不同时间段内的有效数据还是太麻烦了一点。

方法3:本文重点要介绍的方法。该方法是通过把时钟周期设置为时间单位,这样两个光标之间的时间差就是该段时间内的有效数据量了。具体操作方法如下:

如下图用鼠标点击1,会弹出对话框;点击2位置倒三角形,下拉选项中选时钟周期单位是ns;然后再把timeunit 改为clock周期6.736ns,点击OK.

再看delta显示出来的值,已经变成28了,即为我们要的数据量了。

这个方法对于一段时间内的连续有效数据来说,应该是最简单有效的获取数据个数的方法了。任意改变两光标的距离或位置,都很直接的得到该段时间内的连续有效数据量。该方法在debug过程中常常会用到,请大家善加利用。

[2]另外还有一个比较有效的办法是利用verdi的nWave里面的Signal Event Report 功能。该方法虽然稍显麻烦,但善于利用,也可以变得非常好用。方法如下图:

a.鼠标点击选中clk 这个信号;b.点击view菜单,选择下拉菜单里面的SignalEvent report,就会弹出对话框;c.进度条往后拖,会看到Falling#这一栏显示的数据28就是我们要的数据量了。

以上就是一段时间内连续有效数据的几个测量方法。debug的时候方法3最简单便捷,应用频率也较高;但是其他几个方法在特定的场景下也可以发挥出自己的作用,需要根据实际debug的时候灵活应用。

[2]网格法

点击菜单里面的view选项,选择Grid Options,如下图所示:

选中选项Grid on 以及选项Grid Counter with Start Number,如下图所示,点击Apply或者OK之后,就可以看到波形里面出现了网格,最下面有数字出现。这种方法还有一个好处是鼠标左键点到CLK信号的任意位置,计数都是从新的地方开始,具有很强的灵活性。

[4] 自动添加计数器:

右击CLK信号,选择Add Counter Signal by,选择上升沿、下降沿、任意沿中的一个,就会自动产生一个16进制的计数信号,不过它的计数起点是从CLK的0时刻开始,不能选择任意时刻,所以缺乏灵活性。

关于方法3和方法4,更推荐方法3网格法,看起来很强大,大家可以继续探索探索。

[5]打开路径下的verdi.cmd记录了上一次的全部动作。如果verdi意外关闭,可以使用verdi -play verdi.cmd来复原。

[6]可以给clk的上升沿打上标记(好像叫label),在两个光标之间会显示标记的个数,也就是周期数。

2、非连续有效信号量测方法

实际debug过程中,更常遇到的场景是非连续有效的信号,如下图所示:CLK并不是在每个时刻都是有效的,这时我们又该如何比较快速准确的获知某个时间段内有效信号(CLK)个数呢?

跟获取连续有效信号个数一样,如果某个时间段内有效信号个数较少(比如少于10个),直接手动数就可以了。当有效信号toggle次数比较多时,肉眼无法快速看出数量的时候,我们可以利用Verdi nWave里面的Logical operation 和Signal Event report 这两个功能来实现。

对于非连续有效数据传输,通常会有一个信号来标志哪笔数据是有效的,如上图中的valid_in信号为1时表示data_in数据有效。利用这个标志信号跟时钟进行“与”操作,就得到一个新的时钟。这个新的时钟只有在数据有效时才有,在数据无效时被遮掉了。再通过Signal Event report获知指定时间内新的时钟个数,就可以知道有效数据的个数了。

具体操作步骤如下:

(1).鼠标选中时钟信号clk和数据有效标志信号valid_in;(2).点开nWave 菜单里面的Signal,再选择下拉菜单里的Logical Operation,如下图:

(3).在弹出的对话框里面,如下图所示,确认Expression里的信号操作是”&”;把Name 改成valid_in_clk;然后点击Create/Modify按钮;

回来看波形,如下图所示,就会发现多了一个信号valid_in_clk,这个信号就是我们需要的新时钟信号。

(4)接下来就是Signal Event Report闪亮登场了。选中valid_in_clk,然后在View下拉菜单里面选Signal Event Report。如下图所示,在弹出的对话框里,找到Falling#这一列,里面列的数字16就是我们指定的时间段内有效的数据个数了。

如果还是半信半疑的同学,可以手动数一数,看看Logical Operation加Signal Event Report这套组合拳的结果是否正确。


3、搜索查找

Verdi提供了很强大的搜索查找功能,充分利用好这些功能在IC设计/验证过程中可以大大提高debug 效率。下面我们就结合实际应用来介绍一下Verdi中常用的搜索查找功能以及一些使用技巧。


[1] 数值搜索、上升沿和下降沿搜索

进行数值搜索、上升沿和下降沿搜索

选中信号,按n向后搜索,N向前搜索;或者按左右小箭头进行查找搜索。例如:

数值搜索:

上下沿搜索:

[2] 层次浏览器窗格中寻找实例(instance)

在利用 Verdi debug时,首先需要找到我们负责模块的实例(instance),再选择相应的信号来观察它们的行为来debug。当设计很庞大时,要找到底层的一个小模块,如果用鼠标从 top一层一层的往下点,效率会比较低;又或者我们只负责了一个小模块,对整个设计的层级关系并不清楚的时候,找到我们的底层设计会变得非常困难。

这时,只要我们知道底层模块的实例名,就可以利用Verdi的“Show Navigation Text Field”功能快速查找了。操作方法如下图,

a)在Verdi的层次浏览器窗格(Verdi界面的左部)点右键,弹出菜单里选“Show Navigation Text Field”或快捷键“Ctrl+S”

b) 在输入对话框里输入相应的实例名,再点右边的搜索按钮就可以了。

[3] 搜索源代码

源代码窗格里提供了三种搜索指令,功能各不相同,用来应付不同的使用场景。

1)Find scope

Find scope适用于整个chip里面的查找。前面提到的应用场景如下:

A)Source –> find scope或者按shift+S

B)在弹出对话框里Scope Typemodule

Filter内填要找module关键字;Instance list 里面选择一个,点Go Tosource code就会打开该module。

另外,对话框最下面列出了整个设计中找到的个数,可以知道该moduleinstance次数。

2)  Find Signal/Instance/instport

这个指令可以查找指定模块内的信号、实例或输入输出端口。这个指令的好处是可以把要查找的内容都列出来,想看哪一个就用鼠标点一下,就会切换到源代码窗格对应位置。当模块内要查找的signalinstance or input/output port)比较多时,可以快速的找到想看的signal

操作方法如下:

source –> Find Signal/Instance/instport 或者shift+A

选择要查找的类型:signal, instance or instport

输入框里面输入信号名,点Find按钮,下面会列出所有找到的信号,点击某个信号,就会到达source code 里面对应的信号

3)  find string

Find string应该是debug 过程中使用频率最高的查找指令了。只要在输入框里面输入部分或全部要查找的字符串,再点一下find 按钮就可以了。

这个指令可以在当前文档(current File)或者全部文档(All file)里面查找,因为字符串查找匹配得比较多,要根据需要选择在当前文档或全部文档查找,以提高查找效率。

因为使用频率高,Verdi也很贴心的在默认工具栏里放置了Find string的输入窗口,如下:

输入栏输入字符串有几种方法

(1)手动输入,好处是可以只输入部分字符,不用全部输入信号名(2)点击信号,按中键拖入输入栏,然后点向上或向下查找,找同名信号(3)点击信号,按快捷键”Ctrl+F”,信号名就会自动输入到输入栏。这个快捷键很好用。

[4] nWave里面的信号追溯源代码

Debug过程中,往nWave 里添加信号后,查看了信号波形,如果看到异常往往要回头看一下源代码。如果一时找不到了,find string当然可以找得到,但是需要输入一串字符,可能就不那么乐意了。

其实Verdi很贴心,可以直接把nwave里面的波形拖到nTrace里面,可以快速的找到要找的信号。

操作方法:nWave里面选择信号,如out_den。按住中键,直接拖到source code plane,然后放开,就会显示你要找的信号了

上述内容介绍了Verdi常用的几种搜索查找功能和技巧。希望对大家有帮助,debug效率更上一个档次。如果你有什么好想法,也欢迎后台留言一起讨论。

4、总线拆分

分析波形的时候有时候需要把一个多比特的bus拆分成几个位宽较小的bus,以方便观察数值。

右键/Signal -> Bus Operations -> Expand as Sub-bus

32bit分割为48bit bus.

分割结果:

5、统计

统计出某个信号在特定时间段内的跳变的次数。这个结合下一节的逻辑运算,可以把一些复杂的波形分析用直观的形式表现出来。还是右键点击波形窗口左边的某个信号名字,在弹出菜单中选择Signal Event Report。

在弹出的对话框中,可以关注感兴趣的内容,比如Rising#,指的是默认Markers标定的时间段内,该信号的上升沿次数。这样就不用很辛苦的放大波形,用眼睛一个一个去数了。

6、逻辑运算

在一个频繁变化的信号、尤其是多比特的bus信号中观察是否出现了某个值,有时候可以通过搜索来追踪。也可以通过对现有信号执行的逻辑操作创建新信号,或者搜索信号值。但是如何一目了然地看到呢?右键/Signal -> Logical Operation,通过新建一个信号,该信号是待观察信号的某种逻辑表达式。

数值搜索

逻辑操作

例如:两信号进行与运算,也可以进行其他运算。

相与之后结果:

7、manage.rc

manage.rc可以管理多个rc文件,实现每次启动Verdi都能载入预设的设置,同时不受上次启动Verdi后保存的设置影响。还可以保存本次使用过程中更改过的设置,以便更新预设设置。这个略微有些复杂。在启动Verdi时,需要加个参数。

-managercFile some_path/manage.rc

这个manage.rc的内容大概是这样的:

@Manage rc file Version 1.0[File]default_file = ~/load_only.rcworking_file = ./novas.rc
[Load] default_file
[Save] working_file = MODIFIED_KEY

例子中作为只读的default_file文件,可以放一些自己习惯或者喜欢的设置。比如tab等于4还是8,各种界面的字体,以及其它一些每次启动Verdi都希望生效的设置。working_file用来保存本次使用更改的设置,如果有想长期预设的,可以从中copy出来到default_file,这样方便升级迭代。

通过如下常规的参数调用

-rcFile some_path/some.rc

也可以读入一个rc文件实现类似预设功能,不过这种方法的缺点是这个rc文件会被当前调用覆盖。后果就是下次启动的Verdi会带有上次使用的痕迹,比如打开波形文件的目录位置。用的次数多了,不胜其烦。干脆用manage.rc来彻底的解决。

另外,亲测命令行键入 -managercFile 的方式也可以通过设置环境变量来替代,如在 .cshrc 中添加 

setenv NOVAS_MANAGE_RC_FILE some_path/manage.rc

8、Trace代码过程中波形窗口保持前置

不知道从哪个版本开始,Verdi默认打开了Active DetectionTrace窗口在trace过程中会被激活前置,造成波形窗口被遮挡,也是不胜其烦。当然这也属于个人喜好问题。

那如何保持波形窗口始终在前呢?首先需要在Trace下拉菜单中取消Active Detection,然后点击波形窗口右上角的Keep as Top

这样在代码Trace时,波形始终可以看到,方便debugActive Detection可以在rc文件中预设。Keep as Top还没有找到预设的方法。

9、Parameter 提示的默认进制

Verdi中,如果把鼠标放到Verilog代码中的parameter上,可以提示其值是多少。因为各种原因,有时候会以二进制的形式提示,如果这个parameter32比特,那把这个二进制看明白也太费眼睛了。简单的话还是16进制比较易读。这个可以在下图中的Parameter Value Radix中设置。当然也可以把它加入rc文件进行预设。

10使用 Verdi 分析 NBA Delay 的问题

NBA 就是 NonBlocking Assignment,非阻塞赋值的缩写。它通常用来描述一个用时钟沿触发的寄存器。在 Verilog 普及早期,人们通常会在 NBA(Nonblocking Assignments) <= 之后加个单位延时#1来解决早期仿真器行为不一致的问题。

所谓习惯成自然,NBA Unit Delay 在某些设计中一直沿用下来,那么如何去理解这个延时的作用呢?SNUG 上的知名作者 Clifford E. Cummings  2002 年有篇文章阐述的挺详细(Verilog Nonblocking Assignments With Delays,Myths & Mysteries)下面给出一些代码片断,同样感兴趣的朋友可以自己完善并用 VCS 仿真生成波形,然后用 Verdi 打开。

首先创建三个时钟,注意两个二分频时钟的创建方式不同。

always #(10/2) clk = ~clk; always #(20/2) clk_div2_direct = ~clk_div2_direct;
always @ ( posedge clk or negedge rst_n ) begin if ( ~ rst_n ) begin clk_div2 <= 1'b0; end else begin clk_div2 <= ~clk_div2; end end

然后用 clk 触发一个不停翻转的寄存器 d1,再分别用两个二分频时钟去采样,保存在 d5 d6 中。

always @ ( posedge clk or negedge rst_n ) begin  if ( ~ rst_n ) begin    d1  <= 1'b0;  end  else begin    d1  <= ~d1;  endend
always @ ( posedge clk_div2 or negedge rst_n ) begin if ( ~ rst_n ) begin d5 <= 1'b0; end else begin d5 <= d1; endend
always @ ( posedge clk_div2_direct or negedge rst_n ) begin if ( ~ rst_n ) begin d6 <= 1'b0; end else begin d6 <= d1; endend

VCS 仿真的时候,加上编译时选项+fsdb+region和运行时选项+fsdb+delta

然后用 Verdi 打开生成的 fsdb 波形。正常的话,可以看到 d5 d6 的波形是完全不同的,一个是常0,一个是常1

只从上图分析的话,两个二分频时钟的波形是完全一致的,被采样的数据是同一个,那么采到的数据也应该是相同的。但我们知道这两个二分频时钟的生成方式是不同的,那么不同在什么地方呢?

Verdi nWave 窗口中选中 View - Expand Delta - Region Mode,把 Cursor 移动到二分频时钟的上升沿,然后点击Expand/Collapse Time at Cursor,简单点的话直接按 w 键。

然后就可以看到这个仿真时刻的 Simulation Region,里面展示了各个 Event Region 的关系。

这个例子中,只存在绿色的Active Region 和红色的 NBA Region。在某些glitch debug的例子中,还能看到Re-Active RegionRe-NBA Region

Region的展示可以帮助我们很好的理解Verilog 规范中的定义的信号调度。

此外,Verdi还可以通过点击Tools - Event Sequence来显示图形化的Event序列。

11、数字信号的模拟化呈现

Verdi 提供了既简单又直观的操作,去绘制数字信号的模拟变化趋势。尤其是在观察周期性计数的数字信号时,例如调制频率的变化,还有 FIFO 读写地址的变化,这种方式基本是可以做到一目了然的。

操作方式:nWave 窗口菜单 - Waveform - Analog Waveform

对于 Verdi 这个工具来说,它对于数字信号本身的含义目前还没有智能到可以自动识别。所以我们需要指定特定数字信号的表示方式(Notation),是无符号、二补码还是补码等等。

操作方式:nWave 窗口菜单 - Waveform - Set Notation

12、手动调节模拟波形的显示范围

还有一个可能遇到的局限性就是模拟波形的显示范围,Verdi 在绘制数字信号的模拟波形时,默认会按照整个波形的动态范围来绘图。如果一个数字信号的初始值和工作时实际的动态范围差别很大,那么观察实际工作时的模拟波形时,波形变化的幅度相比整个动态范围就会太小,无法明了的看到小动态范围的变化趋势。

还好Verdi提供了手动调节显示范围的功能。

操作方式:nWave 窗口菜单 - Analog - Zoom Value...

根据需要调节上限和下限,调节过程中波形是实时更新的。

对比效果如下图,第一个信号是默认范围的,动态变化缩成一条直线了,没有观察价值。第二个信号是调整了范围的,可以清楚的看到变化趋势。第三个是原始的数字信号。

13、自动调节:切换 FSDB 文件

还有一个比较笨的解决方法是,写出FSDB 文件时,根据特定信号,从数字信号开始动态变化的时候,做一个文件切换。这样就把数字信号初始化部分的波形分离出去。当我们着重分析动态变化的部分时,就不需要加载初始化部分的波形。Verdi在绘制模拟波形的时候,只会看到小动态范围的数值,绘制出来的变化趋势就足够清楚了。

$fsdbDumpfile("tb_000.fsdb");$fsdbDumpvars(0, tb);@(posedge some_trigger_signal);$fsdbSwitchDumpfile("tb_001.fsdb");

14、自动调节:加载特定时间范围

当然作为团队项目的螺丝钉,有时候不方便控制FSDB 文件的产生方式,那么在加载FSDB 文件的时候,可以选择指定一个时间范围。感谢读者 @Erik Li 提供的这个技巧。

操作方式:nWave窗口菜单 - Open,选择 FSDB 文件到 Target Name 后,点击左下方的 Options... 按钮。

在弹出的对话框中选中 Open File By Time Range,然后点击 OK 按钮。

再点击 OK 按钮,在弹出的对话框中就可以选择感兴趣的时间起止范围了。

再分享一个最近才发现的 Verdi 调用参数。

verdi -preTitle "some text"

螺丝钉做久了,需要同时打开的 Verdi 窗口数量与日俱增。怎么从密密麻麻的任务栏图标中找到要找的那个,是个麻烦但不紧急的问题。除了贯彻断舍离、及时关闭短期内不需要的窗口之外,用上面的选项为每一个 Verdi 窗口做个简洁唯一的命名,也是一个不那么有效的解决之道。

15、跳转到指定行号

其实日常的频繁、快速地查看 Verilog 源代码,一般是在独立的文本编辑器中完成的。比如,VCS 编译产生的 log 文件中,对应的 Warning、Error 的后面会跟着相关源文件的路径、行号。如果用的编辑器是版本比较新的 Vim,那么简单的 gF 指令就可以迅速的从 log 文件跳转到对应源文件,而且光标会体贴的定位在出错行。如果是仍未默认支持的旧版 Vim,那么自己可以添加一个函数,可以参考这篇文章

这种方式在门级仿真的场景中会不太灵光。因为门级网表通常都非常巨大,用 Vim 类的编辑器打开一次会非常缓慢,频繁跳转造成的等待就更难以接受了。

浏览门级网表诸如此类的超大文件,用 Verdi 是个不错的选择。在 Verdi Source 窗口中,如何快速跳转到指定的行呢?

用鼠标拖动当然是种办法。但更快捷的是,在 Source 窗口下,按 g 键。会弹出一个小窗口,输入行号,点击确定即可。

16、源文件之间或不同逻辑层次的切换

有时候在 Verdi 中需要频繁的在两个 Verilog module 之间做切换,做一些对比的工作。如果这两个 module 所处的层次距离比较远,那么快捷的切换就显得特别重要了。这里介绍两个小技巧。

第一个是利用 Verdi 支持多 Source Tab 的功能。在两个不同的 Source Tab 中分别打开不同的 module,通过鼠标切换 Source Tab 来实现源文件或者逻辑层次的切换。

打开新的 Source Tab 的比较方便的方法是,在感兴趣的 Instance 上点击右键,然后在右键菜单上点击 Display Source Code in New Tab.

效果类似下图:

第二个技巧是利用 VC Apps 中的Find Instance with Module Def Name

首先打开 Tools 菜单中的 VC Apps Toolbox

Design Exploration 目录中找到上述名字的 App,然后双击执行。

在出现的对话框中输入感兴趣的 module 名字,支持通配符。然后点击确定。

Verdi 下部的调试窗口中会出现一个新的大概叫做 SmartLog 的页面,其中列出了按照 module 名字搜索出来的所有 Instance。单击某个 InstanceSource 页面就会跳转到对应的地方。

重复执行上述过程,但搜索不同的 module name,会形成独立的 SmartLog 页面。这样通过切换 SmartLog 页面,也可以很方便的在多个设计中切换。

17、计数

[1] Grid Options网格计数

可以指定在波形窗中绘制网格线。选项包括Rising Edge, Falling Edge Both EdgesView -> Grid Options 选中Grid on勾选 Grid Count with Start Number,默认是0,也可以按需设置

如图,以AXI_AWVALID上升沿为例,网格线下方出现了计数,用于统计上升沿个数。

[2] 自动计数

右击AXI_WVALID信号,选择Add Counter Signal by,选择上升沿、下降沿、任意沿中的一个。

选择AXI_WVALID信号的上升沿为例子,波形中自动添加一个counter用于统计。

[3] 还有个fsdb转文本的功能:fsdbreport

18 verdi打开覆盖率文件查看覆盖率

打开一个verdi——>tools——>coverage;在新打开的界面中选择——>file——>open/add database——>选择相应的.vdb文件——>more options——打开cov.hier文件

注:覆盖率文件为.vdb文件;.hier文件为对应工程目录的层级结构文件,对整理覆盖率有帮助

19 查看包含的设计架构

20 查询模块实例化位置

在设计结构中双击实例化模块的名字 ->源代码窗口高亮了设计部分的模块名。再双击高亮的模块名->看到在上层模块中的哪一行被调用了

21 在nTrace中如何查找模块和信号

Shift+A

搜索通配符 

22查找位于不同层次的驱动信号【跨层次查看信号,看最终驱动谁,或者看最终被谁驱动】

23 如何查看设计有哪些信号

通过最右下方signal_list来查看,可以选择查看输入/输出等端口类型。

24 如何打开原理图

选中设计-> new schematic

25 如何查看nShema Window中符号对应的源代码

双击对应的功能单元电路图,即可跳转到描述该单元的源代码

26 使用 Fan-In Cone追踪某个信号的驱动逻辑

首先要用上面的办法来查找信号,高亮选中;调用该工具:

这样就可以看到某个信号是如何生成的(可以通过View选项来显示信号名)

27 如何产生 partial hierarchy schematic

用来查看与选择特定信号有关的逻辑/模块
选择需要查看的信号(可以通过shift键来选择多个信号)

选择查看与wclkwrst_n有关的信号/模块/逻辑:

28 如何移动原理图中的器件

鼠标左键选中,按住右键进行拖拽。

29 状态机相关操作

[1] 打开原理图

[2] 双击相应状态机视图后,呈现状态机图

[3] 查看状态的执行和跳转
[4] 查看状态以及节点的相关源代码

选择状态,然后使用鼠标中键拖拽状态到nTrace中的源代码视图中即可

[5] 查看在什么时候状态机转移到某个状态?《与tb有关

要依靠tb打开nstate后,要导入波形

[6] 查看某一种状态转移【状态循环】情况是否会发生

[7] 如何查看某个状态被执行了多少次(与TB有关)

[8] 如何查看某个状态转移到另一个状态的转移次数(与TB有关)

(五) Verd波形(含emulation)加载

1 打开波形

打开常规波形:

verdi -dbdir ./simv.dair -ssf debug.fsdb

打开emulation的波形:

verdi -dbdir ./simv.dair -ssf debug.zwd

打开emulation转换前的波形:

verdi -emulation --zebu-work zebu.work --timescale 1ns --input debug.ztdb

打开fsdb波形和编译文件

verdi  -elab   com_path  -ssf  fsdb_pathcom_path:编译产生的临时文件存放的路径;例:*.daidir/kdb.elab++;fsdb_path:编译产生的fsdb的路径;

2 打开 source code

如果没有kdb文件,可以通过flist打开source code

verdi -f tb_top.flist

3 加载设计

veidi加载设计的脚本命令

verdi -sv -f tb_top_filelist.f -top tb_top &

告知软件支持SystemVerilog,加载设计的文件列表,设置设计顶层,后台执行

4 重新加载设计和波形

选中波形或设计文件Lshift + i)重新加载波形或设计文件,在新一次仿真完成之后Roload即可。

5 波形文件保存*.rc

使用verdi保存已经拉出来的信号方便下次使用,按键shift+S可以将波形保存为xxx.rc格式文件,使用波形文件时,按快捷键r打开界面,选择波形。可以避免下次打开重新添加信号

(六) Verdi常用快捷键总结

ctrl+w:将鼠标指向需要添加到波形上的信号名,通过该快捷键将该信号添加到波形上;shift+l:当鼠标指向波形区时刷新波形,当鼠标指向代码区(src1)时刷新代码;z:缩小波形,显示更长时间的波形;Z:放大波形,显示更短时间内的波形;f:显示全局的波形;shift+s:将当前存在于到波形区的信号保存为.rc后缀的信号列表;shift+m:波形区快捷添加标记时刻;ctrl+d:删除所有信号列表;x:在代码区快捷查看所有信号的当前状态;   在波形区域固定curson(鼠标左键)和marker(鼠标中键)的距离;h:在波形区快捷查看信号的全路径;c:自定义信号的颜色和粗细;t:按一次切换一次信号颜色;m:将信号移动到黄线位置;y:移至中央并保持居中,再按取消固定居中;n:指针跳到信号的下一个跳变沿;N:指针跳到信号的上一个跳变沿;

(七) 赠送跟文相关的一些文档

关注微信公众号《芯片验证日记》,后台回复”verdi_doc”,即可获得下面截图中的文档。


参考文章

[1] https://blog.csdn.net/qq_21842097/article/details/116144372

[2]公众号跟IC君一起学集成电路,《Verdi使用技巧》

[3]公众号issoc,《使用verdi的几个小技巧》

[4]https://blog.csdn.net/sinat_43629962/article/details/123664144

[5]https://blog.csdn.net/Arvin_ing/article/details/127885457


登录阅读全文
  • Verdi
路科验证 专注于数字芯片验证的系统思想和前沿工程领域。路桑是Intel资深验证专家,主持验证架构规划和方法学研究,担任过亿门级通信芯片的验证经理角色。在工程领域之外,他在西安电子科技大学和西安交通大学客座讲授芯片验证课程。著有书籍《芯片验证漫游指南》。
进入专栏
评论 (0)
  • 立即报名:IIC Shenzhen 2024 预见发展新机


  • 华为nova13Pro正式发布:售价3699元起

    快科技 2024-10-22 496浏览
  • 电动汽车用高压直流继电器选型与匹配

    线束中国 2024-10-21 311浏览
  • 印度第三季度智能机出货vivo首次第一

    手机技术资讯 2024-10-21 277浏览
  • 国内外部分人形机器人企业一览

    ittbank 2024-10-21 249浏览
  • 英伟达GB200芯片,出货大增250%

    皇华电子元器件IC供应商 2024-10-21 213浏览
  • 微生物“产气”驱动的微针贴片,主动控制深层透皮给药

    MEMS 2024-10-22 211浏览
  • 光通信芯片,涨价!

    ittbank 2024-10-21 205浏览
  • AGV/AMR激光雷达市场竞争格局:超50家企业“同台竞技”

    移动机器人产业联盟 2024-10-21 176浏览
  • 高通发布骁龙8至尊版,挤爆了谁的牙膏?

    邵乐峰 2024-10-23 05:13 0浏览
  • Infinera将获美国芯片法案9300万美元资助

    国际电子商情综合报道 2024-10-22 18:37 15浏览
  • 苹果在AI技术上落后至少2年,库克回应

    综合报道 2024-10-22 17:51 0浏览
  • 专利侵权案败诉,西部数据被判赔3.157亿美元罚金

    国际电子商情综合报道 2024-10-22 11:21 31浏览
  • Nordic宣布将收购UWB芯片厂商Novelda

    国际电子商情综合报道 2024-10-22 11:02 55浏览
  • SK海力士3亿美元收购越南半导体公司ISCVina

    国际电子商情综合报道 2024-10-22 10:13 59浏览
  • 快速AI与HPC需要合作与共同优化

    Kiterocket公司创始人兼主席Martijn Pierik 2024-10-22 09:00 37浏览
  • 敏捷开发是软件开发成功的灵丹妙药吗?

    Jacob Beningo 2024-10-21 17:52 46浏览
  • 德州仪器 (TI) 全新可编程逻辑产品系列助力工程师在数分钟内完成从概念到原型设计的整个过程

    德州仪器 2024-10-22 12:46 18浏览
  • 芯原畸变矫正处理器IP DW200-FS已通过ISO 26262 ASIL B认证

    芯原 2024-10-22 09:52 17浏览
  • 高通推出骁龙8至尊版,集成全球最快的移动端CPU

    高通 2024-10-22 08:37 20浏览
  • 助力AI芯发展,奕成科技板级高密FOMCM批量量产

    综合报道 2024-10-21 15:54 81浏览
  • 豪威集团与飞利浦合作开发业内首个车内驾驶员健康监测解决方案

    2024-10-19 13:54 289浏览
  • Vicor 发布最高密度车规级电源模块,支持电动汽车实现 48V 电源系统

    2024-10-19 13:43 27浏览
  • 【敏矽微ME32F103 Demokit】+开发环境搭建与串口控制LED验证

    平安一生 2024-10-17 280浏览
  • 【敏矽微ME32F103 Demokit】+串口打印、LED数码管显示测试等

    luckyfox 2024-10-21 103浏览
  • 防雷元件的基础知识

    sales_263623713 2024-10-10 95浏览
  • 【敏矽微ME32F103 Demokit】+ADC模块。

    嵌入式码上游 2024-10-21 85浏览
  • 【敏矽微ME32F103 Demokit】开发板开箱

    伏尔加的鱼 2024-10-20 100浏览
  • #易学易懂 电气回路入门#知识没有国界,愿更多如此优秀的知识涌入中国

    丙丁先生 2024-10-15 77浏览
  • 【拆解】六角形神秘盒子,你认识嘛

    丸子~ 2024-10-09 168浏览
  • 【拆解】永不消逝的电波——摩托罗拉BP机拆解!

    whik 2024-10-06 1004浏览
  • 搞电源,搞电机,教你搞出新花样

    面包板社区管理员 2024-10-10 1246浏览
  • 光敏电阻控制问题

    QWE4562009 2024-10-10 150浏览
  • 回收18650电池,回收动力电池,回收铝壳电池

    991206810_821150124 2024-10-12 66浏览
  • RC电路里,电容多久可以充满电?

    24c01硬件电子 2024-10-15 444浏览
  • 桥堆这样接是否可以实现正反接都可以工作?恒流电阻计算是否合理?

    QWE4562009 2024-10-12 748浏览
  • 【敏矽微ME32F103 Demokit】+ Uart使用

    pandyele 2024-10-20 171浏览
  • 10-1学习笔记
  • 9-23学习笔记
  • 9-20学习笔记
  • Toshiba东芝TB62261FTG中文产品规格书datasheet
  • 和橘子学AI绘图【400集100实战】
  • 10-3学习笔记
  • Toshiba东芝TB62261FTG步进电机驱动IC产品规格书datasheet
  • 9-21学习笔记
  • 9-22学习笔记
  • Toshiba东芝TLP5751产品规格书datasheet
  • 9-28学习笔记
  • 9-26学习笔记
  • [完结14章]MQ大牛成长课--从0到1手写分布式消息队列中间件
  • MATLAB数字信号处理85个实用案例精讲.入门到进阶
  • 光耦应用 | 探讨可控硅光耦在新能源领域的创新应用
    可控硅光耦作为一种重要的光电耦合器件,广泛应用于新能源领域,为新能源技术的发展和应用提供了重要的支持。本文将探讨可控硅光耦在新能源领域的应用情况及其优势。可控硅光耦简介可控硅光耦是一种将输入光信号转换为输出控制电信号的光电耦合器件,具有高耐压、高耐温、高响应速度等特点。它主要由光源、光电转换元件和可控硅器件组成,可以实现光电隔离和电气控制的功能。可控硅光耦在新能源领域的应用1. 太阳能光伏系统可控硅光耦在太阳能光伏系统中广泛应用于光伏逆变器和充电控制器等关键电路中。通过可控硅光耦的控制,可以实现
    晶台光耦 2024-10-21 10:46 125浏览
  • 晶振的寄生频率及测试参数
    理想情况下,晶振应在基频或泛音模式下稳定工作。而在实际应用中,寄生振荡(Spur)可能会干扰主频信号导致主频发生偏移,有以下几点影响:    1. 频率不稳定:主频信号受到干扰后,频率漂移    2. 信号失真:输出波形失真并出现多频成分    3. 设备性能下降:导致电子系统无法正常运行或发生误操作    4. 降低信噪比:寄生振荡会引
    koan-xtal 2024-10-20 06:41 133浏览
  • 虹科方案 | 释放总线潜力:汽车总线离线模拟解决方案
    导读传统的ECU模拟工具通常需要依赖上位机软件来发起通信,这在离线场景和自动化产线中带来不便。为了应对这一挑战,虹科推出了创新的汽车总线离线模拟解决方案,基于PCAN-Router系列网关,通过内部可编程固件,实现了自主报文自发功能和实时离线通信,为工程师提供了一个高效、灵活且安全的测试平台。一、行业痛点ECU模拟工具是专为模拟车辆电子控制单元(ECU)之间的通信和行为而设计的软件/硬件设备。它们具备通信模拟、数据生成与处理、实时模拟能力、故障模拟功能,同时具有接口兼容性、调试分析功能和灵活的配
    虹科汽车智能互联 2024-10-21 13:55 115浏览
  • 可控硅光耦——工业自动化智能转型的护航先锋
    随着工业自动化程度的持续深化,对安全性、可靠性和智能化水平的要求愈发严苛。在这一浪潮中,可控硅光耦凭借其卓越性能,正逐渐成为工业自动化领域的核心驱动力。本文将深入探讨可控硅光耦在工业自动化智能转型中的创新应用与价值。提升生产线安全性在工业自动化生产线中,电气设备与控制系统错综复杂,安全问题不容忽视。可控硅光耦作为出色的隔离器件,以其高效的电气隔离能力,有效防止电气干扰和电路故障对生产线的潜在影响,确保生产线的安全与稳定。实现智能控制与监测为了满足工业自动化系统对智能化控制和监测的需求,可控硅光耦
    晶台光耦 2024-10-22 11:12 67浏览
  • 元器件第049篇 晶体谐振器 (XTAL) 结构 分类
        前一篇介绍了晶体振荡器(Crystal Oscillator, XO),这一篇介绍石英晶体谐振器(Quartz Crystal Resonator),简称 Quartz 或 XTAL。很多工程师习惯叫它“晶振”,也有人叫它“无源晶振”以便和XO区分。    这种元件结构简单:取一个晶体切片,两侧制作电极,电极用引线引出,外面加保护壳,就完成了。晶体周围除了必要的支撑点,没有其它固定物,以便晶体切片自由谐振。石英晶体质地坚硬而脆,因此这个元件天然就比
    电子知识打边炉 2024-10-19 18:23 59浏览
  • 基于DPU的Openstack裸金属服务网络解决方案
    1.  方案背景和挑战裸金属服务器作为一类特别设计的计算类云服务,向最终用户提供了云端部署的专属物理服务器,这意味着最终用户不再需要与其他租户共享硬件资源,从而确保了资源的独占性、性能的最优化以及数据的最高级别安全。裸金属服务器作为云上资源的重要部分,其网络需要与云主机和容器同样连接在VPC下,并且能够像云主机和容器一样使用云上的网络功能和能力。当前,基于OpenStack的裸金属服务实现主要依赖于Ironic组件,并通过OpenStack的Neutron网络组件来实现裸金属服务器的网
    Yusur_Tech 2024-10-22 14:28 80浏览
  • 携手UALink,阿里云磐久AI Infra 2.0服务器亮相2024 OCP全球峰会
    10月15日-17日,一年一度的开放计算全球峰会(OCP Global Summit)在美国加州圣何塞(San Jose)召开,本次峰会以“从创新到影响力(From Ideas to Impact")”为主题盛大开幕,吸引全球7000多位基础设施软硬件技术和应用领域的专业人士参会。作为全球最具影响力的的基础设施和开放计算领域标志性盛会,特别是在今年OCP基金会重磅宣布其人工智能开放系统战略计划后,2024 OCP全球峰会上专门设置人工智能特别关注议程(Special Focus Tracks),
    电子资讯报 2024-10-22 14:13 76浏览
  • 光耦合器固态继电器技术的创新
    光耦合器固态继电器(SSR)取得了显著进步,与机械继电器相比,可提供卓越的电气隔离和可靠的切换。本文探讨了光耦合器SSR的最新创新及其与智能系统、物联网和电动汽车(EV)充电和可再生能源等新兴应用的集成。光耦合器SSR技术的当前趋势高速切换:配备先进光耦合器的现代SSR可提供更快的响应时间,使其成为数据传输和电机控制等高频应用的理想选择。提高效率:氮化镓(GaN)和碳化硅(SiC)等新型半导体材料可改善热管理,降低功耗并延长SSR使用寿命。小型化:集成光耦合器的紧凑型SSR正在为空间受限的设备开
    腾恩科技-彭工 2024-10-18 16:28 64浏览
  • 光耦知识分享 | 浅析施密特触发器光耦的主要特点
    施密特触发器光耦是将施密特触发器与光耦合器件(光电耦合器)相结合的一种电路设计。在这种设计中,光耦将输入信号转换成光信号,并通过光学隔离的方式将输入信号和输出信号电气地隔离开来,以增强电路的抗干扰能力和安全性。下面简要分析施密特触发器光耦的主要特点:电气隔离:光耦器件将输入和输出信号通过光信号传递,实现了电气隔离,从而防止了直接的电气连接。这种隔离可以防止地线干扰、电气击穿等问题,提高了电路的安全性和稳定性。抗干扰能力强:光耦器件的光学隔离特性可以有效隔离输入和输出之间的干扰信号,提高了电路的抗
    晶台光耦 2024-10-22 09:58 69浏览
  • 工业自动化为什么依赖光耦隔离器
    光耦合器隔离器在工业自动化中必不可少,可确保信号传输,同时保护敏感电子设备和人员免受高压影响。选择合适的光耦合器隔离器取决于对操作环境和隔离要求的了解。本文将重点介绍在为工业应用选择光耦合器隔离器时需要考虑的关键因素。 光耦合器隔离器在工业自动化中的作用在工业环境中,光耦合器隔离器在系统的不同部分之间提供电气隔离。这种隔离可保护低压控制电路免受高压电力电子设备的影响,使光耦合器在以下方面至关重要:PLC:安全地连接控制信号。电机驱动器:将控制电路与高压部分隔离。工业传感器:确保干净的信
    腾恩科技-彭工 2024-10-18 16:30 60浏览
  • 米尔基于全志T527系列核心板,国产高性能车载视频监控、部标一体机方案
    在国内对于特种车辆有重点安全防范要求,"两客一危"是对道路运输车辆的一种分类方式,其中“两客”指的是客运车辆和公交车辆,而“一危”指的是危险货物运输车辆。这种分类方式主要用于强调这些车辆在道路运输中的特殊地位,因为它们通常需要满足更高的安全标准。在国内,“两客一危"车辆通常需要安装"部标机”,也就是满足特定部门标准的设备。这些设备可能包括但不限于定位设备、驾驶员行为监控设备、车辆定位系统等系统构件。随着安全管理意思的加强,在理解满足部标机要求的基础上,运营方往往提出更高要求、更多功能需求。T52
    米尔电子嵌入式 2024-10-18 17:05 55浏览
  • 三菱PLC使用ST语言超详细教程,用"C语言"玩转PLC
    简介ST语言,全称为结构化文本(Structured Text),是一种高级编程语言,专为工业自动化和控制系统设计。我们学习PLC一般是用梯形图,梯形图学会后,学习SFC,但是我发现梯形图和SFC虽然简单,但是做大一点的项目比较复杂就有点乱,然后我就想有没有和单片机一样,用类似C语言的方法,来对PLC编程,然后我就发现可以使用ST语言(结构化文本)来对PLC编程,可以用类似C语言的语法来编程进行了几个星期的了解和学习之后,我将学习的一些心得和方法写下来。同时可以给入门PLC的同学,提供一个新的、
    小恶魔owo 2024-10-22 22:47 64浏览
  • 光耦——连接半导体创新的桥梁
    半导体技术作为现代科技的重要支柱之一,在电子、通信、能源等领域都有着广泛的应用。而在半导体领域,光耦作为一种重要的光电器件,正以其独特的优势和广泛的应用领域,为半导体创新注入新的活力,成为连接半导体创新的桥梁。实现电气与光学的转换在半导体器件的制造和应用过程中,经常需要将电气信号转换为光学信号,或者将光学信号转换为电气信号。而光耦作为一种光电转换器件,能够实现电气与光学之间的转换,为半导体器件的互联和应用提供了新的解决方案。通过光耦,可以实现对半导体器件的隔离、控制、数据传输和信号转换,提高了半
    晶台光耦 2024-10-21 10:48 110浏览
  • 匠心独运,专业领航:多像素LED技术创新之路
    汽车前照灯性能革命性突破技术革新的源头不在于某个科学发现或设计巧思,而在于一种愿景,一个天马行空的未来畅想。在2010年代初,我们的专业工程师团队在与客户的交流中迸发出灵感:他们大胆设想——打造像素化LED光源。当时,LED还是一块只能发出均一光束的简单芯片——就像一个单独的“像素”。我们工程师的构想真正来自未来:由成百上千个独立光束组成的光源。如果在汽车前照灯上应用,它将赋予光线全新意义:光束动态适应车外不断变化的环境,同时还能传递信息。很快,这一构想对行业和终端消费者的潜在价值展现出了强大吸
    艾迈斯欧司朗 2024-10-22 16:35 74浏览
我要评论
0
16
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦

玻璃钢生产厂家玻璃钢景观雕塑行情郑州玻璃钢雕塑加工鄂州玻璃钢雕塑加工买玻璃钢花盆注意事项宿迁玻璃钢海豚雕塑厂家武汉水果玻璃钢雕塑江津区玻璃钢雕塑泰安玻璃钢景观雕塑专业做商场美陈的玻璃钢雕塑招标工艺河北中庭商场美陈哪家好德城玻璃钢雕塑公司福建大型商场美陈哪里有扬州玻璃钢仿铜雕塑多少钱秋季商场美陈装饰扬州玻璃钢雕塑商家玻璃钢雕塑艺术性潮州玻璃钢景观雕塑造型精美西安玻璃钢景观雕塑玻璃钢卡通雕塑设计价位内江玻璃钢造型雕塑呈贡玻璃钢雕塑的设计贵不贵山西玻璃钢花盆铁岭玻璃钢花盆花器江西玻璃钢仿真水果雕塑价格晋城玻璃钢雕塑生产厂家河北周年庆典商场美陈销售厂家徐州盐城玻璃钢雕塑焦作园林景观玻璃钢景观雕塑鞍山玻璃钢雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化