要问做逻辑的什么看的最久,那一定是波形吧。那除了看波形,还能做点儿其他的么?
调试“三十六计”
作为逻辑开发者,仿真是一个永远跑不掉的话题。尽管说严格来讲设计和验证是分离的,但对于fpga开发来讲,即便是大厂也很少配备专门的逻辑验证人员来支持你的工作。无论是单元级仿真还是系统级仿真,那些年我们常用到仿真调试手段首推的估计就是看波形了。但老实讲,小的模块或者小的case看看波形还好,但如果是比较大的模块或case需要很长的时间来跑的话那么追踪波形对我个人来讲还是很废眼神的~
那么除了查看波形,我们常用的仿真调试手段无外乎在待仿真测试逻辑里添加打印和添加sva了。对于添加打印,在之前通过verilog/systemverilog搬砖时是时常干的事情,而sva在上学的那会儿倒是看过下面这本书:
那么如今转到spinalhdl,这些手段是否还能用呢?
assertion
与systemverilog中相似,spinalhdl中也提供assertion功能,其关键字也为assert:
assert(assertion : bool, message : string = null, severity: assertnodeseverity = error)assert(assertion: bool, message: seq[any], severity: assertnodeseverity)
assertion:断言条件
message:断言失败时显示信息,可以是字符串或者是seq。
severity:断言等级。
来看一个demo:
这里放置了两个assert,分别使用了两种assert的使用方式。message中放置seq时可以显示更多的提示信息。 要知道即便我们是采用spinalhdl,在仿真的时候还是要生成verilog文件交给仿真器去执行的。那看下生成的rtl代码:
可以看到,在spinalhdl中,对于sva中的立即断言和并发断言,其只支持并发断言。而且会生成额外逻辑用来支持断言,而且在复位期间是不做断言检查的。
report
spinalhdl中提供了report方法用于在逻辑中显示打印信息:
def report(message: string) = assert(false, message, note)def report(message: seq[any]) = assert(false, message, note) def report(message: string, severity: assertnodeseverity) = assert(false, message, severity)def report(message: seq[any], severity: assertnodeseverity) = assert(false, message, severity) 可以看到,report的底层实现是基于assert来实现的,且默认断言失败,故而信息会一直打印。像上面的dmeo我们可以添加下面的打印信息:
report(seq(“data0:”,io.data0,“ data1:”,io.data1,“ sum:”,io.sum),warning)
在生成的rtl代码中会有:
同样不出意外,在复位期间将不会打印任何信息。
formal
针对sva的支持,spinalhdl提供了部分支持。在spinalhdl-doc中给出了下面的这个demo:
object mytoplevelsystemverilogwithformal { def main(args: array[string]) { val config = spinalconfig(defaultconfigforclockdomains = clockdomainconfig(resetkind=sync, resetactivelevel=high)) config.includeformal.generatesystemverilog(new toplevel()) }}
但这个demo有几个问题是: 1、使用generationflags.formal及includeformal时如果我们的代码在generationflags外围如果有使用assert或者report时,generationflags.formal会将其屏蔽掉,在仿真时不起作用。 2、initstate()在verilator中不支持。 针对上面的问题,可以采用: 1、采用generationflags.simulation和includesimulation替代generationflags.formal及includeformal。 2、如果要在复位期间添加sva,那么通过clockdomain.isresetactive替换initstate() 当在生成verilog时不添加includesimulation,那么generationflags.simulation所包含的内容将不会生成在verilog中,从而能够提供一个干净的代码。 手册中给出了支持的sva:
但具体还是要看仿真器是否支持,毕竟verilator和vcs这些在功能上还是有一些差距。
文章来源:spinal fpga
图片来源:似猿非猿的fpga
基于FPGA的快速傅立叶变换算法研究
无人驾驶如何做出道德选择?
关于旋转编码器的分析和应用介绍
自动焊接机器人技术已日益成熟 主要有以下优点
常用大功率高耐压场效应管参数
仿真调试手段在SpinalHDL中还能用吗?
利用活体茎秆强度测定仪来研究玉米品质的优劣
关于射频和微波信号发生器的分析和介绍
保护升压负载及其电源
安防助力下 预防救援重建发展速度不断加快
3种整流电路助你理解二极管为什么能够整流?
乐Max3?乐视未发布旗舰工程机曝光
物联网发展受限主要是因为这几点
iphone供应链价格受压?摄像头模组业务仍有利可图
奔驰首款纯电SUV车型EQC在德国本土市场只卖出55辆
IBM和Verizon宣布了物联网合作伙伴关系
5G商用一年,我国的5G网络建设实现全球领先
如何通过SDS2000的高波形捕获率观察偶发信号
三星5G新电台 移动边缘计算
安森美半导体打造行业首款支持快充的智能单芯片移动电源方案