✎ 编 者 按
聊一聊cocotb中Scoreboard的使用
》Scoreboard接口
仿真无非就是灌入数据,监控输出,将输出与预期结果进行比较以判定功能是否正确。而比较判定这个动作可以交给cocotb中的Scoreboard来实现。Scoreboard的接口实现如下图所示:
》初始化__init__
Scoreboard中的初始化逻辑较为简单:
这里fail_immediately参数用于指示当发生比较错误时是立即停止还是只是只打印报错信息,保持默认参数即可。
expeced字典则用于记录关联Monitor和对应的比较操作任务。
》add_interface
add_interface则是Scoreboard使用正确与否的关键函数。先看其接口列表:
- monitor:指明需要执行比较动作的monitor实例
- expected_output:期望的结果
- compare_fn:待执行的比较函数
- reorder_depth:指明比较的深度,当且仅当expected\_output为List时有效。
- strict_type:当为True时,将会对ref transaction和monitor recv transaction进行类的比较。当为False时则会将两者转换成字符串进行比较。
这里有几种情况在使用时需要明确:
1、当compare_fn不为空时,expected_output,reorder_depth,strict_type均没有意义。
在这种情况下,Scoreboard的处理流程为:
此时会将用户的compare_fn通过Monitor的add_callback直接注册进Monitr中。不过这就要求用户传入的compare_fn必须为一个可执行函数,且接受一个transaction作为参数。此时比较行为完全由用户自己决定。
2、当compare_fn为空,而expected_output为可执行函数时,此时reorder_depth参数没有使用意义。
在该情况下,每当Monitor收到一个transaction任务时,均调用expeced_output获取一个reference transaction后通过compare进行比较:
3、当compare_fn为空,而expected_output为列表时,此时会使用reorder_depth参数做“进一步”结果匹配:
可以看到,当Monitor收到一个transaction后,其会查看expected_outut的前reorder_depth个元素进行查看是否有匹配命中的。
后两种情况均会调用默认的compare函数作为结果比较的方法。正常情况下可能第一种和第三种用的比较多。
》compare
compare为Scoreboard默认的比较方法,其值得注意的是strict_type参数。建议设置成False,此时会将recv_transaction和exp_transaction转换成字符串进行比较。在定义transaction时也建议重写__str__方法。
》result
result函数则可以用于在仿真结束时对于那些上面所说的第三种情况的比较任务进行判断是否所有的expected_output比较任务均已消耗完成。
》Example
按例,最后附上一个第三种情况的example:
这里我们在pkgIn,pkgOut中均定义了__str__方法。ref_transaction在pkgInDrc中的sendPkg中产生。
作者:玉骐
原文链接:Spinal FPGA
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注[Spinal FPGA]欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。