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中來更明確。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM