Verilog在线评测系统设计与实现

2017-07-13 07:22张德学张小军郭华
教育教学论坛 2017年29期

张德学+张小军+郭华

摘要:近年来,在线评测系统(Online Judge,OJ)在多种编程语言的教学、ACM竞赛中得到了广泛应用,实践效果良好。Verilog是一种硬件描述语言,目前尚没有支持该语言的在线评测系统。本文以较流行的在线评测系统HUSTOJ为基础,对其扩展以支持Verilog语言,能够实现Verilog代码在线编辑、提交、后台仿真、结果评价,可用于Verilog语言个人学习、课堂教学、结课评测以及竞赛。

关键词:在线评测系统,Verilog,Online Jud

一、前言

在线评测Online Judge系统,简称OJ[1],是一个在线的判题系统。用户可以在线提交程序源代码(如C/C++/Java等),系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。OJ系统最初用于ACM-ICPC国际大学生程序设计竞赛和OI信息学奥林匹克竞赛中的自动判题和排名,现广泛应用于世界各地高校学生程序设计的训练、参赛队员的训练和选拔、各种程序设计竞赛以及数据结构和算法的学习和作业的自动提交判断中。著名的OJ系统有RQNOJ、URAL等,各具特色的OJ系统也在不断的推出和完善。HUSTOJ[2]是一款出色的开源项目,由华中科技大学前ACM队员Sempr等同学开发,2008年5月14日首先上线于华中科技大学,目前已有近百家学校、公司使用HUSTOJ进行计算机程序设计竞赛、计算机程序设计日常教学与测验、人才招聘等。HUSTOJ采用GPL开源,目前主要由张浩斌先生在维护,项目地址:https://github.com/zhblue/hustoj。HUSTOJ仍在持续更新,目前支持C、c++、Java、bash、python、ruby等17种语言。

Verilog[3]是一种硬件描述语言,是主流的电子系统设计语言,是国内外高校的EDA、FPGA、数字IC设计相关课程的重要内容。Verilog语言主要面向硬件设计,有其独特的特点,但其代码也可以通过仿真软件在计算机中运行、调试,与其他编程语言类似。目前尚没有支持Verilog语言的在线评测系统。本文以HUSTOJ为基础,对其扩展以支持Verilog语言,能够实现Verilog代码在线编辑、提交、后台仿真、结果评价,可用于Verilog语言个人学习、课堂教学、结课评测以及竞赛。

二、HUSTOJ代码框架

HUSTOJ分为core和web两部分,分别对应判题和数据管理两大功能。两者之间数据交换有两种方式:(1)通过数据库轮询;(2)通过http请求。两种方式的选择在判题端的配置文件/home/judge/etc/judge.conf中,HTTP_JUDGE=1则启用后者,默认为前者。

core分3部分:judged、judge_client、sim,其中judged为服务进程,负责轮询数据库或web端,提取判题队列。当发现新任务时产生judge_client进程。judge_client进程为实际判题程序,负责准备运行环境、数据,运行并监控目标程序的系统调用,采集运行指标,判断运行结果。sim为抄袭检查模块,可进行语法分析判断文本相似度,通过检验的程序将由judge_client复制进题目数据的ac目录,成为新的参考样本。

web分两大部分:前端和admin目录下的管理程序。前端是数据库的CRUD(增加Create、查询Retrieve、更新Update和删除Delete)操作,是将用户提交的程序源码加入数据库的任务队列(solution表、souce_code表)。管理程序提供账号管理、试题等方面的功能。

三、HUSTOJ后台数据库

HUSTOJ后台数据库默认名为jol,含18个表,主要的表有:users(帐号信息)、problem(问题)、solution(答案)、compileinfo(编译输出信息)、runtimeinfo(运行时输出信息)、contest(竞赛信息)等,可使用phpmyadmin等工具查看其数据库结构。

四、HUSTOJ系统添加Verilog语言支持

通过阅读HUSTOJ系统代码,深入了解其工作原理,修改代码添加新语言支持。HUSTOJ系统中有一份增添新语言支持的简略说明,参见文档[4]。

守护程序judged主要是定期查询数据库,发现有新任務时,提取测试需用的输入输出文件,并设置各种参数,调用judge_client程序,judged的工作不涉及具体语言,无需修改。

主要的修改工作在judge_client.cc及相关头文件中:

(1)在okcalls64.h中添加Verilog语言编译运行时需用到的syscalls。

本次项目中,Verilog代码的编译采用开源的iverilog仿真器。可用“apt-get install iverilog”安装iverilog程序。

编写一段简单的Verilog代码 helloworld.v:

module helloworld;

initial begin

$display("Hello,Verilog World!");

end

endmodule

执行:strace -ff iverilog helloworld.v 2>&1|awk -F\( '{print $1}'|sort –u >strace.log)

可以得到iverilog编译verilog代码时所需用到的系统调用名称,适当修改后,写入okcalls64.h中,如:

int LANG_VerilogV[256] = {

SYS_access,

SYS_arch_prctl,

SYS_brk,

/*部分略 */

0 };

(2)在judge_client.cc的void init_syscalls_limits(int lang)函数中,添加对新语言系统调用的支持,即在末尾处添加:

if (lang == 18) { //Verilog

for (i = 0;i==0||LANG_VerilogV[i];i++)

call_counter[LANG_VerilogV[i]] = HOJ_MAX_LIMIT;

}

(3)修改lang_ext变量,添加新语言后缀,本例添加了”v”

static char lang_ext[18][8] = { "c","cc","pas","java","rb","sh","py","php","pl","cs","m","bas","scm","c","cc","lua","js","v" };

(4)在judge_client.cc的int compile(int lang,char * work_dir)函数中,添加Verilog语言的编译指令:

const char * CP_Verilog[] = { "iverilog","Main.v",NULL };

及执行命令:

case 17:

execvp(CP_Verilog[0],(char * const *) CP_Verilog);

break;

(5)在judge_client.cc的void run_solution(int & lang,char * work_dir,int & time_lmt,int & usedtime,int & mem_lmt)函數中,添加Verilog代码编译后执行语句:

case 18://verilog

execl("./a.out","./a.out",(char *) NULL);

break;

(6)在配置文件/home/judge/etc/judge.conf中添加verilog语言(编号为18)的支持:

OJ_LANG_SET=0,1,2,3,4,5,6,7,8,9,10,11,18

五、系统测试

在Ubuntu 14.04.5 LTS系统中安装HUSTOJ原系统,并添加Verilog语言支持后,客户浏览器访问http:///JudgeOnline,即可进入HUSTOJ系统。系统运行界面如图1所示。

六、总结

本文深入研究了HUSTOJ的工作原理,并对其扩展以支持Verilog语言,目前基本实现了Verilog支持,可用于Verilog语言个人学习及课堂教学。进一步开发可从如下方面:(1)创建高质量的题库。HUSTOJ系统支持xml格式的题库,利于交流,如freeproblemset[4]。建设高质量题库是提高在线评测系统实用性的关键措施之一。(2)考虑到Verilog这类硬件描述语言与普通编程语言的差别,即不能仅比对最终结果来判断是否正确,还需要考虑内部信号变化的时序问题,在判题方法上还需要进一步研究。

参考文献:

[1] OJ. 百度百科. http://baike.baidu.com/view/1185778.htm,2017,2.

[2] HUSTOJ. zhblue. http://www.hustoj.com/oj/,2017,2.

[3] Verilog. wiki. https://en.wikipedia.org/wiki/Verilog,2017,2 .

[4] summary how to add programming language to hustoj . zhblue. https://github.com/zhblue/hustoj/blob/master/wiki/AddProgrammingLanguage.md,2017,2.

[5] freeproblemset. zhblue. https://github.com/zhblue/freeproblemset.git,2017,2.

Abstract:In recent years,online evaluation system (Online,Judge,OJ) in a variety of programming language teaching,ACM contest has been widely used in practice,good effect of.Verilog is a hardware description language,there is no online evaluation system that supports the language. This paper is based on HUSTOJ online evaluation system more popular. To extend it to support the Verilog language,Verilog code can achieve online editing,submission,background simulation,the evaluation result can be used in Verilog language learning,classroom teaching,teaching evaluation and competition.

Key words:online evaluation system;Verilog;Online Judge