Verilog篇(二)系统函数
显示任务:$display,$write, 前者总会输出一个换行符,后者不会。
固定输出格式版:$displayb/$displayo/$displayh/$writeb/$writeo/$writeh。
只是固定默认的输出格式,也可以通过%0x执行输出方式。
(%m 显示模块路径, \转义字符)
(%p 可以直接打印出,enum,struct,array)
$fmonitor(file, "%m:%t addr = %h data = %h", $realtime, addr, data);
监控任务:$strobe, 在某一时刻,记录变量的值到log和STDOUT,在该时刻所有Event已经触发,仿真时间将向前走时。forever @(negedge clock)
$strobe("At time %t, data is %h", $time,data);
也是在postpone区域内被执行。
$monitor,同一仿真时候只能触发一个task,还有控制任务$monitoron, $monitoroff,触发之后,在每个toggle时刻都会输出log。在postpone区域被执行。
文件读写:$fopen, $fclose 句柄必须是一个interger类型。类型r/w/a(append),r+/w+/a+ 缺省时,默认是写。
interger Write_Out_file; Write_out_file = $fopen("Write_Out_File.txt"); $fdisplay (Write_Out_File, "%h\n%h", addr, data); $fclose(Write_Out_File);
$fdisplay, $fwrite, $fstrobe, $fmonitor 用法类似,只需要加一个文件句柄。类似的有$fwriteo, $fwriteb, $fwriteh等。
其他几个特殊的任务:
c = $fgetc (fd); 读一个byte到c中。
$swrite, $sformat(output_reg, formal_string, list_of_argument) 按字符串格式输出到一个reg variable。
$fgets(str, fd);读入一行字符到str中。
$fscanf(fd, format, args); 按标准输入到文件fd。
$sscanf(str, format, args);按标准输入到reg str。
$fflush(fd); 将buffer立即输出到fd文件中。
写入memory:$readmemb/readmemh 二进制与16进制。 reg[7:0] mem[1:256]; initial $readmemh("mem_data", mem, 128, 1);
(mem_data中只能有空格,制表符等,注释,2进制/16进制数据。第三位起始地址,第四位结束地址,不特殊写明时,默认从0--$)
@address in hex data
@2f ff(十六进制)
$sdf_annotate("sdf_file",,,,,,):将sdf文件读入设计中。可选参数module_instance(反标module,缺省当前模块),log_file(指定输出log的名字),mtm_spec(min/typ/max反标种类),scale_factor(scale因子),scale_type(scale在min/typ/max选择)。
第一组,检查时序窗口的稳定性,包括:setup、hold、recovery和removal。
setup:$setup (data_event, reference_event, limit, notifier);
当reference_event time - limit < data_event time < reference_event time时,就会报告setup time violations。
hold: $hold (reference_event, data_event, limit, notifier);
当reference_event time < data_event time < reference_event time + limit时,就会报告hold time violations。
setup/hold:$setuphold (reference_event, data_event, setup_limit, hold_limit, notifier);
$setuphold是$setup和$hold两者的联合。例如:
$setuphold (posedge clk, negedge d, 2, 1, notifier); 等于
$setup (negedge d, posedge clk, 2, notifier); 和 $hold (posedge clk, negedge d, 1, notifier);
数据事件常常是数据信号,而参考事件常常是时钟信号。
参考:http://www.cnblogs.com/poiu-elab/archive/2012/08/25/2655937.html
仿真控制:$finish, $stop
随机数产生:$random(seed), $dist_uniform(seed, start, end); 返回有符号32位的随机数。
command line input:$test$plusargs(string)
Run simulator with +HELLO initial begin
if ($test$pluargs("HELLO")) $display();
end
$value$pluargs(user_string, variable)
Run simulator with +TESTNAME = THIS TEST initial begin
if ($value$pluargs("TESTNAME = %s", testname)) start_test();
end
verilog中的ifdef和ifndef后加name,但是endif之后不能加。
verilog中的行分隔符,之间换行即可,靠";"分行。
标识符可以放在begin...end/ fork...join/ module...endmodule/ task...endtask/ function...endfunction中来更明确。