對verilog的初學(xué)者來說,線網(wǎng)和變量reg之間的不同點(diǎn),也許是最難的。你有時得用reg而有時卻得使用wire,使用來使用去,簡直頭暈。
而在SystemVerilog中,我們將會看到你可以在過去verilog中用reg型或是wire型的地方用logic型來代替。
實(shí)際上logic是對reg數(shù)據(jù)類型的改進(jìn),使得它除了作為一個變量之外,還可以被連續(xù)賦值、門單元和模塊所驅(qū)動,顯然,logic是一個更合適的名字。
舉個RAM modelling的例子來說明上述問題,我們分別用Verilog和SystemVerilog來實(shí)現(xiàn)。
//RAM modelling in Verilog1 module mema (r_wb,addr,d_q);2 input r_wb;3 input [7:0] addr;4 inout [7:0] d_q;5 6 wire r_wb;7 wire [7:0] addr, d_q;8 reg [7:0] mem [0:255];9 10 assign d_q= (r_wb) ? mem[addr] : 8'hz ;11 12 always @(r_wbor addr)13 if (!r_wb)14 mem[addr]= d_q;15 endmodule
//RAM modelling in SystemVerilog1 module mema (r_wb,addr,d_q);2 input r_wb;3 input [7:0] addr;4 inout [7:0] d_q;5 6 logic r_wb;7 logic [7:0] addr logic [7:0] d_q; //Gotcha! should be declared: wire [7:0] d_q;8 logic [7:0] mem [0:255];9 10 always @(r_wbor addr)11 if (!r_wb)12 mem[addr]= d_q;13 else14 d_q = mem[addr];15 endmodule
如上所看,拋去inout類型外,其余所有的變量都可以聲明為logic類型,不用區(qū)分線網(wǎng)和變量reg之間的不同點(diǎn),所以,SystemVerilog的優(yōu)點(diǎn)是不是很明顯?
SystemVerilog的其他優(yōu)點(diǎn),請大家參考:http://www.doulos.com/knowhow/sysverilog/tutorial
值得注意的是,logic不能有多個結(jié)構(gòu)性的驅(qū)動,也就是說,logic不允許使用多于一次的持續(xù)賦值語句和輸出端口連接的給同一變量賦值。這是因?yàn)闆]有類似于線網(wǎng)的多重驅(qū)動變量的定論。因此,假如你通過這些方式給一個變量賦過值,你將不能再用過程賦值語句給變量賦值。
如上面RAM modelling的代碼,在對inout雙向總線建模的時候,需要使用線網(wǎng)類型。(比起verilog-1995,新增加的許多systemverilog feature都要求變量只有一個驅(qū)動!)
如下代碼的第3行和第4行,logic型的"exception"相繼被兩個實(shí)例化賦值,于是編譯器便會報錯。解決的辦法是把exception定義成wire型。
//Multiple Driver Example1 module multiple_drivers (output logic exception,2 input logic [7:0] a, b);3 is_zero inst0 (exception, b);4 is_greater inst1 (exception, a, b);5 endmodule6 7 module is_zero (output logic zero,8 input logic [7:0] x);9 always @(x)10 if (x==0) zero=1;11 else zero=0;12 endmodule13 14 module is_greater (output logic greater,15 input logic [7:0] x, y);16 always @(x, y)17 if (x> y) greater=1;18 else greater=0;19 endmodule新聞熱點(diǎn)
疑難解答