LaTeX: SystemVerilog Syntax Highlighting und Code Snippets

Flattr this!

Kaum das erste Luxusproblem umschifft, kommt das zweite: Ich will SystemVerilog-Code schön in meinem Anhang haben. Für Code, Snippets und Dateien nutzt man in der Regel das Paket listings. Wer aufmerksam die Beschreibung gelesen hat, merkt, dass SystemVerilog nicht dabei ist, obwohl es eigentlich mindestens ein Dialekt von Verilog ist. Irgendwie kam diese Sprache nie in das Paket, also muss man es ergänzen.

Da ich es nicht geschafft habe, eine eigene Sprachendefinition im Vorspann oder sonst wo zum Laufen gebracht habe, blieb nur der harte Weg, indem ich die Quelldatei editiert habe:

sudo gedit /usr/local/texlive/2013/texmf-dist/tex/latex/listings/lstlang3.sty

Nicht schön, aber nötig. Dann habe ich mir Listen der Schlüsselwörter und des ganzen anderen Parser-Krempel angesehen. Daraus entstand nun die abgestufte Liste mit farbigen Kommentaren, die man ans Ende der Datei vor der Zeile \endinput editieren muss:

\lst@definelanguage{SystemVerilog}
{morekeywords={% reserved keywords
alias,always,always_comb,always_ff,always_latch,and,assert,assign,assume,
automatic,before,bind,bins,binsof,break,cmos,constraint,context,continue,
cover,cross,deassign,default,design,disable,dist,do,edge,else,expect,export,
extends,extern,final,first_match,for,force,foreach,forever,fork,forkjoin,if,iff,
ifnone,ignore_bins,illegal_bins,import,incdir,include,initial,inside,instance,
intersect,join,join_any,join_none,liblist,library,macromodule,matches,medium,
modport,nand,negedge,new,nmos,nor,noshowcancelled,not,notif0,notif1,null,
or,packed,pmos,posedge,priority,protected,pulsestyle_onevent,
pulsestyle_ondetect,pure,rand,randc,randcase,randsequence,rcmos,realtime,
ref,reg,release,repeat,return,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,
showcancelled,solve,tagged,this,throughout,time,timeprecision,timeunit,tran,
tranif0,tranif1,tri,tri0,tri1,triand,trior,trireg,unique,use,vectored,wait,wait_order,
wand,weak0,weak1,while,wildcard,wire,with,within,wor,xnor,xor},
morekeywords=[2]{% folders
begin,case,casex,casez,class,clocking,config,function,generate,covergroup,interface,
module,package,primitive,program,property,specify,sequence,table,task,end,endcase,
endclass,endclocking,endconfig,endfunction,endgenerate,endgroup,endinterface,
endmodule,endpackage,endprimitive,endprogram,endproperty,endspecify,
endsequence,endtable,endtask},
morekeywords=[3]{% system tasks and functions $assertkill,$assertoff,$asserton,$bits,$bitstoreal,$bitstoshortreal,$cast,$comment,
$countdrivers,$countones,$dimensions,$display,$dist_chi_square,$dist_erlang,
$dist_exponential,$dist_normal,$dist_poisson,$dist_t,$dist_uniform,$dumpall,$dumpfile,
$dumpflush,$dumplimit,$dumpoff,$dumpon,$dumpvars,$error,$exit,$fatal,$fclose,$fdisplay,
$fell,$feof,$ferror,$fflush,$fgetc,$fgets,$finish,$fmonitor,$fopen,$fread,$fscanf,$fseek,
$fstrobe,$ftell,$fullskew,$fwrite,$get_coverage,$getpattern,$high,$history,$hold,$increment,
$incsave,$info,$input,$isunbounded,$isunknown,$itor,$key,$left,$list,$load_coverage_db,
$log,$low,$monitor,$monitoroff,$monitoron,$nochange,$nokey,$nolog,$onehot,$onehot0,
$past,$period,$printtimescale,$q_add,$q_exam,$q_full,$q_initialize,$q_remove,$random,
$readmemb,$readmemh,$realtime,$realtobits,$recovery,$recrem,$removal,$reset,
$reset_count,$reset_value,$restart,$rewind,$right,$root,$rose,$rtoi,$sampled,$save,
$scale,$scope,$set_coverage_db_name,$setup,$setuphold,$sformat,$shortrealtobits,
$showscopes,$showvariables,$showvars,$signed,$size,$skew,$sreadmemb,$sreadmemh,
$sscanf,$stable,$stime,$stop,$strobe,$swrite,$time,$timeformat,$timescale,$timeskew,
$typename,$typeof,$uandom,$ungetc,$unit,$unpacked_dimensions,$unsigned,$upscope,
$urandom_range,$value,$plusargs,$var,$vcdclose,$version,$warning,$width,$write},
morekeywords=[4]{ %
bit,buf,bufif0,bufif1,byte,cell,chandle,const,coverpoint,defparam,enum,event,genvar,highz0,
highz1,inout,input,int,integer,large,local,localparam,logic,longint,output,parameter,pull0,
pull1,pulldown,pullup,real,shortint,shortreal,signed,small,specparam,static,string,strong0,
strong1,struct,super,supply0,supply1,type,typedef,union,unsigned,var,virtual,void},
morekeywords=[5]{% compiler directives
`begin_keywords,`celldefine,`default_decay_time,`default_nettype,`default_trireg_strength,
`define,`delay_mode_distributed,`delay_mode_path,`delay_mode_unit,`delay_mode_zero,
`else,`elsif,`end_keywords,`endcelldefine,`endif,`ifdef,`ifndef,`include,`line,
`nounconnected_drive,`pragma,`resetall,`timescale,`unconnected_drive,`undef},
alsoletter=\`,
sensitive,
morecomment=[s][\color{blue!80}]{/*}{*/},
morecomment=[l][\color{blue}]//,
morestring=[b]“
}[keywords,comments,strings]

Da kann der eine oder andere Käfer noch drin sein oder jemand ist mit der Abstufung der einzelnen Schlüsselwörter unzufrieden, kann man frei nach Schnauze umsortieren oder die Farbanweisungen löschen. Dazu empfehle ich noch folgende Anweisungen in der Datei selbst vor dem eigentlichen Code:

\lstset{keywordstyle=\color{purple}}
\lstset{keywordstyle={[2]\color{purple}} }
\lstset{keywordstyle={[3]\color{magenta}} }
\lstset{keywordstyle={[4]\color{teal} }}
\lstset{keywordstyle={[5]\color{violet!40}} }

Dabei habe ich mich ein wenig an den Farben von gedit orientiert. Ich wünsche insgesamt viel Erfolg.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Rechenaufgabe: * Time limit is exhausted. Please reload CAPTCHA.