(Remark 2022-07-07): 本文原发于知乎,现在在博客这边补个档。
夜深人静的时候有些难以入眠(实际上可能是早上起太迟了),于是开一篇文章大略记叙一下部署在 https://verilogoj.ustc.edu.cn/ 处的 USTC Verilog OJ 的设计实现和留下的坑。
设计一个 Verilog OJ 的想法源于 2020 春的《软件工程》课程,课程伊始要求同学们以 10 人为一组提交一个大作业。正好,当时 lluckydog 提到了这个点子,我们就去找实验中心的老师协商,老师也感觉不错。
设计之初,考虑到 Verilog 作为硬件描述(和仿真)语言的地位,我们认为 Verilog OJ 本身应该与其它程序设计语言的 OJ 有所不同。这种不同主要是来源于电路这种设计产出与程序这种产出之间的差异。
电路可以从功能和性能两方面来进行评价。对于功能,用行为级仿真就可以解决,而对于性能,则要将其放到后端当中去,从占用的资源,完成功能所需要的时钟周期和可以达到的最高时钟频率,以及使用到的资源等来综合的进行评价。这就意味着,OJ 在执行架构上需要兼容各种不同的评价任务,并且可以灵活配置。
针对这一点,我们认为应该将每个判题任务配置为 shell 脚本,在脚本中读取用户输入的文件,并且进行输出操作,这样就可以比较灵活的进行不同评测任务的配置了。
我们当时还调研了前端和后端评测任务的一些可能方向,比如使用 OpenTimer 进行静态时序分析,使用 Yosys 进行综合并且判断电路综合后有没有 latch 等等。
架构
前端方面我们是从 LPOJ 的代码基础上开始修改的,所以也沿用了 Element UI + Vue.js 的组合;编辑代码采用 CodeMirror,显示波形采用 Wavedrom。
后端采用 Django + Django RESTful Framework,Django 赋予的快速原型能力我们整体还是比较满意的。
后端和判题机通过消息队列 Celery 实现解耦,为增加新的判题机留出空间,同时将两个过程掰开。判题机提交判题结果的方法就是把 SubmissionResult 对象进行 HTTP PATCH。
判题机本身会在每个新的判题请求到来时,从后端拉下来所有需要的文件,同时新启动一个 Docker 容器用来判题,判题完成时会将容器中分数、日志、波形(app_data)拷出并上传,之后销毁容器。容器本身有时间和内存限制。
大多数判题任务就是在参考答案和用户提交答案上面跑一个 testbench 并且 dump vcd,然后做一个波形比较。vcd 文件解析使用的是 pyDigitalWaveTools。
使用 Nginx 做反代,方便调整一些请求头之类的,上面所有的部分都打包为容器,并且用 docker-compose 进行部署。
题目
软工课程答辩前,我们设计了几道简单的题目来验证 Verilog OJ 的功能。这些题目包括输出 0,输出 1,3-8 译码器和三个数的比较器等。前面几道题目是行为级的仿真,最后一题用到了 Yosys 进行综合,并且对综合后结果进行仿真(大概就是 yosys -p "read_verilog ./submit/code.v; synth -top top_module; write_verilog code_synthed.v" -v 3
)
不过软工结束之后,由于鸽子们鸽来鸽去,想搞的计算机组成原理实验自动评测一直没有动静,助教们最后也还是决定手工检查,所以系统就有派上用场。
2021 年署假的时候,老师决定先翻译一些 HDLBits 上面的题目,作为下学期数字电路实验的一小部分,来帮助 Verilog 的学习。
在这学期出题和同学们做题的过程中,也发现并且修复了一些脚本上的问题,主要是 VCD 的一些 corner case。
剩下的坑
使用过程中同学们提了很多意见,这些意见基本都以 Issue 的形式放到了仓库当中去。不过不少问题都被我们一直鸽着,也缺乏感兴趣的新同学加入进来。
远期来说,我个人希望这个平台可以帮助希望做硬件开发的同学们更贴近 IC 业界考虑的问题,并且对硬件设计本身有更好的理解——当然鉴于我本人是个硬件菜鸡,这还需要很多大佬的支持才能办到。
就我个人从前辈处了解到的一些信息来说,IC 的验证和后端的流程普通的同学还是很难接触到的,可能在平台中有关于验证和后端设计需要关心的问题进行设计并包装成为题目是值得尝试的一些方向。
比如说,SystemVerilog / UMD 通用验证方法学 的超快速入门,调教时序问题的小实战等
另一个可能值得尝试的坑是对接 USTC FPGAOL 平台,将片上的表现作为评估和设计迭代的依据。
(不过听着就是大坑.jpg)
结语
赶紧来个大佬填坑吧!(x)
希望有更多感兴趣的同学加入到我们的开发(和提 Issue)的工作当中ww