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中来更明确。

posted @ 2015-04-02 16:49  _9_8  阅读(7815)  评论(0编辑  收藏  举报