1. 程式人生 > >Matlab中如何將長字串換行寫

Matlab中如何將長字串換行寫

太長不看版

舉例如下:

% Port definition
fprintf(fID,[...
    '\n'...
    'input clk;'                    '\n'...
    'input rst_n;'                  '\n'...
    'input [%d:0] msg;'             '\n'...%row-1
    'input in_valid;'               '\n'...
    'output reg [%d:0] codeword;'   '\n'...%col-1
    'output reg out_valid;'
'\n'... ]
,row-1,col-1);
  • 加上中括號;
  • 將長字串分割成多個子字串;
  • 子字串之間至少隔一個空格;
  • 換行符用...

正文

最近在搞畢設的東西,其中有一個需要寫很麻煩的verilog檔案。麻煩但是卻不復雜,LDPC的編碼器,大概就是一個200多bits寬的輸入訊號,500多bit寬的輸出訊號,輸出每個bit都是由某些輸入的bit進行相同的運算得到的,用一個200多*500多的矩陣表示對應關係。如果要單純寫verilog,會死人的,如果在verilog裡寫生成邏輯,又要佔用很大的記憶體來存放生成矩陣,而且邏輯難寫。於是就想到用Matlab程式碼來生成verilog程式碼。

Matlab裡有fprintf函式可以輸出資料到檔案。
舉個栗子,fprintf(fID,'Hello world!');就可以把“Hello world!”輸出到fID對應的檔案中。
開啟檔案的函式是fID = fopen('filepath/filename.postfix','w');其中w表示寫入,如果是讀取則換成r,更多用法請help fopen

那麼問題來了,如果我把verilog程式碼的每一行分別用一個fprintf輸出,那麼我的.m檔案就會充斥著一大堆fprintf,我這個強迫症對這種高度重複的程式碼簡直不能忍。但是如果我把每個功能塊單獨寫在一個fprintf裡,可讀性確實高很多,但是fprintf那行就會很長,同樣不能忍,並且修改的時候會非常痛苦!
於是我就去找有沒有類似Linux指令碼中‘\’的換行符,讓直譯器把多行程式碼當成一行去執行。

確實有這個換行符,
... ←三個點就是Matlab裡的換行符。可以將該行的尾部和下一行的頭部連線起來。
但是另一個問題就出來了,這個換行符沒辦法用在字串中間,我把一整塊的程式碼當成一個字串,如果中間加上換行符,那麼直譯器會把換行符也當做要輸出的內容,一起輸出去了。

由於 fprintf 的引數分別為:檔案handler、輸出array、輸出資料(如有)。
舉栗子:fprintf( fID, 'data1: %d\n', data1);
其中中間的字串會被當成一個只有一個元素的array。
所以解決方法就來了,只要把中間的array多加幾個元素,就可以分割長字串,並在子字串之間新增換行符。

舉栗子:

% Port definition
fprintf(fID,[...
    '\n'...
    'input clk;'                    '\n'...
    'input rst_n;'                  '\n'...
    'input [%d:0] msg;'             '\n'...%row-1
    'input in_valid;'               '\n'...
    'output reg [%d:0] codeword;'   '\n'...%col-1
    'output reg out_valid;'         '\n'...
    ],row-1,col-1);

用單引號括起來的每一個小字串會被解釋為輸出array的一個元素,子字串之間用空格(可多個,至少一個) 或逗號隔開,即一個單行的矩陣(array)。
中括號必不可少,是將各子字串結合為一個array的標識。

另外因為verilog裡經常需要輸出類似 3b'101之類的東西,而單引號會被當做元素的起/止符。想要輸出單引號,就需要連續打2個單引號。比如:fprintf(fID, 'outdata <= 3''b101 ')。這也是為什麼兩個子字串中間至少要有一個空格的原因,如果沒有空格就會被連線起來,並且中間多了個單引號。