張德學(xué)+張小軍+郭華
摘要:近年來(lái),在線評(píng)測(cè)系統(tǒng)(Online Judge,OJ)在多種編程語(yǔ)言的教學(xué)、ACM競(jìng)賽中得到了廣泛應(yīng)用,實(shí)踐效果良好。Verilog是一種硬件描述語(yǔ)言,目前尚沒(méi)有支持該語(yǔ)言的在線評(píng)測(cè)系統(tǒng)。本文以較流行的在線評(píng)測(cè)系統(tǒng)HUSTOJ為基礎(chǔ),對(duì)其擴(kuò)展以支持Verilog語(yǔ)言,能夠?qū)崿F(xiàn)Verilog代碼在線編輯、提交、后臺(tái)仿真、結(jié)果評(píng)價(jià),可用于Verilog語(yǔ)言個(gè)人學(xué)習(xí)、課堂教學(xué)、結(jié)課評(píng)測(cè)以及競(jìng)賽。
關(guān)鍵詞:在線評(píng)測(cè)系統(tǒng),Verilog,Online Jud
一、前言
在線評(píng)測(cè)Online Judge系統(tǒng),簡(jiǎn)稱(chēng)OJ[1],是一個(gè)在線的判題系統(tǒng)。用戶可以在線提交程序源代碼(如C/C++/Java等),系統(tǒng)對(duì)源代碼進(jìn)行編譯和執(zhí)行,并通過(guò)預(yù)先設(shè)計(jì)的測(cè)試數(shù)據(jù)來(lái)檢驗(yàn)程序源代碼的正確性。OJ系統(tǒng)最初用于ACM-ICPC國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽和OI信息學(xué)奧林匹克競(jìng)賽中的自動(dòng)判題和排名,現(xiàn)廣泛應(yīng)用于世界各地高校學(xué)生程序設(shè)計(jì)的訓(xùn)練、參賽隊(duì)員的訓(xùn)練和選拔、各種程序設(shè)計(jì)競(jìng)賽以及數(shù)據(jù)結(jié)構(gòu)和算法的學(xué)習(xí)和作業(yè)的自動(dòng)提交判斷中。著名的OJ系統(tǒng)有RQNOJ、URAL等,各具特色的OJ系統(tǒng)也在不斷的推出和完善。HUSTOJ[2]是一款出色的開(kāi)源項(xiàng)目,由華中科技大學(xué)前ACM隊(duì)員Sempr等同學(xué)開(kāi)發(fā),2008年5月14日首先上線于華中科技大學(xué),目前已有近百家學(xué)校、公司使用HUSTOJ進(jìn)行計(jì)算機(jī)程序設(shè)計(jì)競(jìng)賽、計(jì)算機(jī)程序設(shè)計(jì)日常教學(xué)與測(cè)驗(yàn)、人才招聘等。HUSTOJ采用GPL開(kāi)源,目前主要由張浩斌先生在維護(hù),項(xiàng)目地址:https://github.com/zhblue/hustoj。HUSTOJ仍在持續(xù)更新,目前支持C、c++、Java、bash、python、ruby等17種語(yǔ)言。
Verilog[3]是一種硬件描述語(yǔ)言,是主流的電子系統(tǒng)設(shè)計(jì)語(yǔ)言,是國(guó)內(nèi)外高校的EDA、FPGA、數(shù)字IC設(shè)計(jì)相關(guān)課程的重要內(nèi)容。Verilog語(yǔ)言主要面向硬件設(shè)計(jì),有其獨(dú)特的特點(diǎn),但其代碼也可以通過(guò)仿真軟件在計(jì)算機(jī)中運(yùn)行、調(diào)試,與其他編程語(yǔ)言類(lèi)似。目前尚沒(méi)有支持Verilog語(yǔ)言的在線評(píng)測(cè)系統(tǒng)。本文以HUSTOJ為基礎(chǔ),對(duì)其擴(kuò)展以支持Verilog語(yǔ)言,能夠?qū)崿F(xiàn)Verilog代碼在線編輯、提交、后臺(tái)仿真、結(jié)果評(píng)價(jià),可用于Verilog語(yǔ)言個(gè)人學(xué)習(xí)、課堂教學(xué)、結(jié)課評(píng)測(cè)以及競(jìng)賽。
二、HUSTOJ代碼框架
HUSTOJ分為core和web兩部分,分別對(duì)應(yīng)判題和數(shù)據(jù)管理兩大功能。兩者之間數(shù)據(jù)交換有兩種方式:(1)通過(guò)數(shù)據(jù)庫(kù)輪詢(xún);(2)通過(guò)http請(qǐng)求。兩種方式的選擇在判題端的配置文件/home/judge/etc/judge.conf中,HTTP_JUDGE=1則啟用后者,默認(rèn)為前者。
core分3部分:judged、judge_client、sim,其中judged為服務(wù)進(jìn)程,負(fù)責(zé)輪詢(xún)數(shù)據(jù)庫(kù)或web端,提取判題隊(duì)列。當(dāng)發(fā)現(xiàn)新任務(wù)時(shí)產(chǎn)生judge_client進(jìn)程。judge_client進(jìn)程為實(shí)際判題程序,負(fù)責(zé)準(zhǔn)備運(yùn)行環(huán)境、數(shù)據(jù),運(yùn)行并監(jiān)控目標(biāo)程序的系統(tǒng)調(diào)用,采集運(yùn)行指標(biāo),判斷運(yùn)行結(jié)果。sim為抄襲檢查模塊,可進(jìn)行語(yǔ)法分析判斷文本相似度,通過(guò)檢驗(yàn)的程序?qū)⒂蒵udge_client復(fù)制進(jìn)題目數(shù)據(jù)的ac目錄,成為新的參考樣本。
web分兩大部分:前端和admin目錄下的管理程序。前端是數(shù)據(jù)庫(kù)的CRUD(增加Create、查詢(xún)Retrieve、更新Update和刪除Delete)操作,是將用戶提交的程序源碼加入數(shù)據(jù)庫(kù)的任務(wù)隊(duì)列(solution表、souce_code表)。管理程序提供賬號(hào)管理、試題等方面的功能。
三、HUSTOJ后臺(tái)數(shù)據(jù)庫(kù)
HUSTOJ后臺(tái)數(shù)據(jù)庫(kù)默認(rèn)名為jol,含18個(gè)表,主要的表有:users(帳號(hào)信息)、problem(問(wèn)題)、solution(答案)、compileinfo(編譯輸出信息)、runtimeinfo(運(yùn)行時(shí)輸出信息)、contest(競(jìng)賽信息)等,可使用phpmyadmin等工具查看其數(shù)據(jù)庫(kù)結(jié)構(gòu)。
四、HUSTOJ系統(tǒng)添加Verilog語(yǔ)言支持
通過(guò)閱讀HUSTOJ系統(tǒng)代碼,深入了解其工作原理,修改代碼添加新語(yǔ)言支持。HUSTOJ系統(tǒng)中有一份增添新語(yǔ)言支持的簡(jiǎn)略說(shuō)明,參見(jiàn)文檔[4]。
守護(hù)程序judged主要是定期查詢(xún)數(shù)據(jù)庫(kù),發(fā)現(xiàn)有新任務(wù)時(shí),提取測(cè)試需用的輸入輸出文件,并設(shè)置各種參數(shù),調(diào)用judge_client程序,judged的工作不涉及具體語(yǔ)言,無(wú)需修改。
主要的修改工作在judge_client.cc及相關(guān)頭文件中:
(1)在okcalls64.h中添加Verilog語(yǔ)言編譯運(yùn)行時(shí)需用到的syscalls。
本次項(xiàng)目中,Verilog代碼的編譯采用開(kāi)源的iverilog仿真器。可用“apt-get install iverilog”安裝iverilog程序。
編寫(xiě)一段簡(jiǎn)單的Verilog代碼 helloworld.v:
module helloworld;
initial begin
$display("Hello,Verilog World!");
end
endmodule
執(zhí)行:strace -ff iverilog helloworld.v 2>&1|awk -F\( '{print $1}'|sort –u >strace.log)
可以得到iverilog編譯verilog代碼時(shí)所需用到的系統(tǒng)調(diào)用名稱(chēng),適當(dāng)修改后,寫(xiě)入okcalls64.h中,如:
int LANG_VerilogV[256] = {
SYS_access,
SYS_arch_prctl,
SYS_brk,
/*部分略 */
0 };
(2)在judge_client.cc的void init_syscalls_limits(int lang)函數(shù)中,添加對(duì)新語(yǔ)言系統(tǒng)調(diào)用的支持,即在末尾處添加:
if (lang == 18) { //Verilog
for (i = 0;i==0||LANG_VerilogV[i];i++)
call_counter[LANG_VerilogV[i]] = HOJ_MAX_LIMIT;
}
(3)修改lang_ext變量,添加新語(yǔ)言后綴,本例添加了”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)函數(shù)中,添加Verilog語(yǔ)言的編譯指令:
const char * CP_Verilog[] = { "iverilog","Main.v",NULL };
及執(zhí)行命令:
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)函數(shù)中,添加Verilog代碼編譯后執(zhí)行語(yǔ)句:
case 18://verilog
execl("./a.out","./a.out",(char *) NULL);
break;
(6)在配置文件/home/judge/etc/judge.conf中添加verilog語(yǔ)言(編號(hào)為18)的支持:
OJ_LANG_SET=0,1,2,3,4,5,6,7,8,9,10,11,18
五、系統(tǒng)測(cè)試
在Ubuntu 14.04.5 LTS系統(tǒng)中安裝HUSTOJ原系統(tǒng),并添加Verilog語(yǔ)言支持后,客戶瀏覽器訪問(wèn)http://
六、總結(jié)
本文深入研究了HUSTOJ的工作原理,并對(duì)其擴(kuò)展以支持Verilog語(yǔ)言,目前基本實(shí)現(xiàn)了Verilog支持,可用于Verilog語(yǔ)言個(gè)人學(xué)習(xí)及課堂教學(xué)。進(jìn)一步開(kāi)發(fā)可從如下方面:(1)創(chuàng)建高質(zhì)量的題庫(kù)。HUSTOJ系統(tǒng)支持xml格式的題庫(kù),利于交流,如freeproblemset[4]。建設(shè)高質(zhì)量題庫(kù)是提高在線評(píng)測(cè)系統(tǒng)實(shí)用性的關(guān)鍵措施之一。(2)考慮到Verilog這類(lèi)硬件描述語(yǔ)言與普通編程語(yǔ)言的差別,即不能僅比對(duì)最終結(jié)果來(lái)判斷是否正確,還需要考慮內(nèi)部信號(hào)變化的時(shí)序問(wèn)題,在判題方法上還需要進(jìn)一步研究。
參考文獻(xiàn):
[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