testbench

testbench

1. 激勵的產(chǎn)生

對于testbench而言,端口應當和被測試的module一一對應。端口分為input,output和inout類型產(chǎn)生激勵信號的時候,input對應的端口應當申明為reg, output對應的端口申明為wire,inout端口比較特殊,下面專門講解芦岂。

1)直接賦值。

一般用initial塊給信號賦初值垫蛆,initial塊執(zhí)行一次禽最,always或者forever表示由事件激發(fā)反復執(zhí)行腺怯。

舉例,一個module

module exam();

reg rst_n;

reg clk;

reg data;

initial

begin

clk=1'b0;

rst=1'b1;

#10

rst=1'b0;

#500

rst=1'b1;

end

always

begin

#10

clk=~clk;

end

大家應該注意到有個#符號川无,該符號的意思是指延遲相應的時間單位呛占。該時間單位由timscale決定.一般在testbench的開頭定義時間單位和仿真 精度,比如`timescale 1ns/1ps懦趋,前面一個是代表時間單位晾虑,后面一個代表仿真時間精度。以上面的例子而言仅叫,一個時鐘周期是20個單位帜篇,也就是20ns。而仿真時間精度的概 念就是诫咱,你能看到1.001ns時對應的信號值笙隙,而假如timescale 1ns/1ns,1.001ns時候的值就無法看到坎缭。對于一個設計而言竟痰,時間刻度應該統(tǒng)一,如果設計文件和testbench里面的時間刻度不一致掏呼,仿真 器默認以testbench為準坏快。一個較好的辦法是寫一個global.v文件,然后用include的辦法憎夷,可以防止這個問題莽鸿。

對于反復執(zhí)行的操作,可寫成task,然后調(diào)用岭接,比如

task load_count;

input [3:0] load_value;

begin

@(negedge clk_50);

$display($time, " << Loading the counter with %h >>", load_value);

load_l = 1’b0;

count_in = load_value;

@(negedge clk_50);

load_l = 1’b1;

end

endtask //of load_count

initial

begin

load_count(4’hA);?? // 調(diào)用task

end

其他像forever,for,function等等語句用法類似富拗,雖然不一定都能綜合臼予,但是用在testbench里面很方便鸣戴,大家可以自行查閱參考文檔

2) 文件輸入

有時候,需要大量的數(shù)據(jù)輸入粘拾,直接賦值的話比較繁瑣窄锅,可以先生成數(shù)據(jù),再將數(shù)據(jù)讀入到寄存器中缰雇,需要時取出即可入偷。用 $readmemb系統(tǒng)任務從文本文件中讀取二進制向量(可以包含輸入激勵和輸出期望值)。$readmemh 用于讀取十六進制文件械哟。例如:

reg [7:0]?? mem[1:256]?? //?? a 8-bit, 256-word 定義存儲器mem

initial?? $readmemh ( "E:/readhex/mem.dat", mem ) // 將.dat文件讀入寄存器mem中

initial?? $readmemh ( "E:/readhex/mem.dat", mem, 128, 1 ) // 參數(shù)為寄存器加載數(shù)據(jù)的地址始終

2.?? 查看仿真結(jié)果

對于簡單的module來說疏之,要在modelsim的仿真窗口里面看波形,就用add wave ..命令

比如暇咆,testbench的頂層module名叫tb,要看時鐘信號锋爪,就用add wave tb.clk

要查看所有信號的時候丙曙,就用 add wave /*

當然,也可以在workspace下的sim窗口里面右鍵單擊instance來添加波形

對于復雜的仿真其骄,免不了要記錄波形和數(shù)據(jù)到文件里面去亏镰。

1)波形文件記錄

常見的波形文件一般有兩種,vcd和fsdb拯爽,debussy是個很好的工具索抓,支持fsdb,所以最好是modelsim+debussy的組合

默認情況下毯炮,modelsim不認識fsdb逼肯,所以需要先裝debussy,再生成fsdb文件桃煎。

$dumpfile和$dumpvar是verilog語言中的兩個系統(tǒng)任務汉矿,可以調(diào)用這兩個系統(tǒng)任務來創(chuàng)建和將指定信息導入VCD文件.

對于fsdb文件來說,對應的命令是fsdbDumpfile,dumpfsdbvars

(什么是VCD文件? 答:VCD文件是在對設計進行的仿真過程中备禀,記錄各種信號取值變化情況的信息記錄文件洲拇。EDA工具通過讀取VCD格式的文件,顯示圖形化的仿真波形曲尸,所以赋续,可以把VCD文件簡單地視為波形記錄文件.)下面分別描述它們的用法并舉例說明之。

$dumpfile系統(tǒng)任務:為所要創(chuàng)建的VCD文件指定文件名另患。

舉例("http://"符號后的內(nèi)容為注釋文字):

initial

$dumpfile ("myfile.dump"); //指定VCD文件的名字為myfile.dump纽乱,仿真信息將記錄到此文件

$dumpvar系統(tǒng)任務:指定需要記錄到VCD文件中的信號,可以指定某一模塊層次上的所有信號昆箕,也可以單獨指定某一個信號鸦列。

典型語法為$dumpvar(level, module_name); 參數(shù)level為一個整數(shù),用于指定層次數(shù)鹏倘,參數(shù)module則指定要記錄的模塊薯嗤。整句的意思就是,對于指定的模塊纤泵,包括其下各個層次(層次數(shù)由 level指定)的信號骆姐,都需要記錄到VCD文件中去。

舉例:

initial

$dumpvar (0, top); //指定層次數(shù)為0捏题,則top模塊及其下面各層次的所有信號將被記錄

initial

$dumpvar (1, top); //記錄模塊實例top以下一層的信號

//層次數(shù)為1玻褪,即記錄top模塊這一層次的信號

//對于top模塊中調(diào)用的更深層次的模塊實例,則不記錄其信號變化

initial

$dumpvar (2, top); //記錄模塊實例top以下兩層的信號

//即top模塊及其下一層的信號將被記錄

假設模塊top中包含有子模塊module1公荧,而我們希望記錄top.module1模塊以下兩層的信號带射,則語法舉例如下:

initial

$dumpvar (2, top.module1); //模塊實例top.module1及其下一層的信號將被記錄

假設模塊top包含信號signal1和signal2(注意是變量而不是子模塊), 如我們希望只記錄這兩個信號,則語法舉例如下:

initial

$dumpvar (0, top.signal1, top.signal2); //雖然指定了層次數(shù)循狰,但層次數(shù)是不影響單獨指定的信號的

//即指定層次數(shù)和單獨指定的信號無關(guān)

我們甚至可以在同一個$dumpvar的調(diào)用中窟社,同時指定某些層次上的所有信號和某個單獨的信號捻浦,假設模塊top包含信號signal1,同時包含有子模 塊module1桥爽,如果我們不但希望記錄signal1這個獨立的信號朱灿,而且還希望記錄子模塊module1以下三層的所有信號,則語法舉例如下:

initial

$dumpvar (3, top.signal1, top.module1); //指定層次數(shù)和單獨指定的信號無關(guān)

//所以層次數(shù)3只作用于模塊top.module1, 而與信號

top.signal1無關(guān)

上面這個例子和下面的語句是等效的:

initial

begin

$dumpvar (0, top.signal1);

$dumpvar (3, top.module1);

end

$dumpvar的特別用法(不帶任何參數(shù)):

initial

$dumpvar; //無參數(shù)钠四,表示設計中的所有信號都將被記錄

最后盗扒,我們將$dumpfile和$dumpvar這兩個系統(tǒng)任務的使用方法在下面的例子中綜合說明,假設我們有一個設計實例缀去,名為 i_design侣灶,此設計中包含模塊module1,模塊module1下面還有很多層次缕碎,我們希望對這個設計進行仿真褥影,并將仿真過程中模塊 module1及其以下所有層次中所有信號的變化情況,記錄存儲到名為mydesign.dump的VCD文件中去咏雌,則例示如下:

initial

begin

$dumpfile ("mydesign.dump"); //指定VCD文件名為mydesign.dump

$dumpvar (0, i_design.module1); //記錄i_design.module1模塊及其下面層次中所有模塊的所有信號

end

對于生成fsdb文件而言凡怎,也是類似的

initial

begin

$fsdbDumpfile("tb_xxx.fsdb");

$fsdbDumpvars(0,tb_xxx);

end

2)文件輸出結(jié)果

integer out_file;?? // out_file 是一個文件描述,需要定義為 integer類型

out_file = $fopen ( " cpu.data " ); // cpu.data 是需要打開的文件赊抖,也就是最終的輸出文本

設計中的信號值可以通過$fmonitor, $fdisplay,$fwrite

其中$fmonitor只要有變化就一直記錄统倒,$fdisplay和$fwrite需要觸發(fā)條件才記錄

例子:

initial begin

$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);

end

always@(a or b)

begin

$fwrite(file_id,"At time%t a=%b b=%b",$realtime,a,b);

end

3 testbench的技巧

1).如果激勵中有一些重復的項目,可以考慮將這些語句編寫成一個task氛雪,這樣會給書寫和仿真帶來很大方便房匆。例如,一個存儲器的testbench的激勵可以包含write报亩,read等task浴鸿。

2).如果DUT中包含雙向信號(inout),在編寫testbench時要注意弦追。需要一個reg變量來表示其輸入岳链,還需要一個wire變量表示其輸出。

3).如果initial塊語句過于復雜骗卜,可以考慮將其分為互補相干的幾個部分宠页,用數(shù)個initial塊來描述。在仿真時寇仓,這些initial塊會并發(fā)運行。這樣方便閱讀和修改烤宙。

4).每個testbench都最好包含$stop語句遍烦,用以指明仿真何時結(jié)束。

5).加載測試向量時躺枕,避免在時鐘的上下沿變化服猪,比如數(shù)據(jù)最好在時鐘上升沿之前變化供填,這也符合建立時間的要求。

4.一個簡單的例子

module counter (clk, reset, enable, count);

input clk, reset, enable;

output [3:0] count;

reg [3:0] count;

always @ (posedge clk)

if (reset == 1'b1) begin

count <= 0;

end else if ( enable == 1'b1) begin

count <= count + 1;

end

endmodule

testbench

module counter_tb;

reg clk, reset, enable;

wire [3:0] count;

counter U0 (

.clk (clk),

.reset?? (reset),

.enable (enable),

.count?? (count)

);

initial begin

clk = 0;

reset = 0;

enable = 0;

end

always

#5?? clk =?? ! clk;

initial?? begin

$dumpfile ("counter.vcd");

$dumpvars;

end

initial?? begin

$display("\t\ttime,\tclk,\treset,\tenable,\tcount");

$monitor("‰d,\t‰b,\t‰b,\t‰b,\t‰d",$time, clk,reset,enable,count);

end

initial

#100?? $finish;

//Rest of testbench code after this line

endmodule

5?? 雙向端口

這個我沒用過罢猪,完全是從網(wǎng)上google的近她,如果有問題,大家再討論吧

芯片外部引腳很多都使用inout類型的膳帕,為的是節(jié)省管腿粘捎。一般信號線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r候就要用到INOUT類型了。就是一個端口同時做輸入和 輸出危彩。 inout在具體實現(xiàn)上一般用三態(tài)門來實現(xiàn)攒磨。三態(tài)門的第三個狀態(tài)就是高阻'Z'。當inout端口不輸出時汤徽,將三態(tài)門置高阻娩缰。這樣信號就不會因為兩端同時 輸出而出錯了,更詳細的內(nèi)容可以搜索一下三態(tài)門tri-state的資料.

1 使用inout類型數(shù)據(jù),可以用如下寫法:

inout data_inout;

input data_in;

reg data_reg;//data_inout的映象寄存器

reg link_data;

assign data_inout=link_data?data_reg:1’bz;//link_data控制三態(tài)門

//對于data_reg,可以通過組合邏輯或者時序邏輯根據(jù)data_in對其賦值.通過控制link_data的高低電平,從而設置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時當作輸入端口使用.link_data可以通過相關(guān)電路來控制.

2 編寫測試模塊時,對于inout類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.

當上面例子中的data_inout用作輸入時,需要賦值給data_inout,其余情況可以斷開.此時可以用assign語句實現(xiàn):assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg類型變量,在測試模塊中賦值.

另外,可以設置一個輸出端口觀察data_inout用作輸出的情況:

Wire data_out;

Assign data_out_t=(!link)?data_inout:1’bz;

else,in RTL

inout use in top module(PAD)

dont use inout(tri) in sub module

也就是說谒府,在內(nèi)部模塊最好不要出現(xiàn)inout拼坎,如果確實需要,那么用兩個port實現(xiàn)完疫,到頂層的時候再用三態(tài)實現(xiàn)演痒。理由是:在非頂層模塊用雙向口的話,該 雙向口必然有它的上層跟它相連趋惨。既然是雙向口鸟顺,則上層至少有一個輸入口和一個輸出口聯(lián)到該雙向口上,則發(fā)生兩個內(nèi)部輸出單元連接到一起的情況出現(xiàn)器虾,這樣在 綜合時往往會出錯讯嫂。

對雙向口,我們可以將其理解為2個分量:一個輸入分量兆沙,一個輸出分量欧芽。另外還需要一個控制信號控制輸出分量何時輸出。此時葛圃,我們就可以很容易地對雙向端口建模千扔。

例子:

CODE:

module dual_port (

....

inout_pin,

....

);

inout inout_pin;

wire inout_pin;

wire input_of_inout;

wire output_of_inout;

wire out_en;

assign input_of_inout = inout_pin;

assign inout_pin = out_en ? output_of_inout : 高阻;

endmodule

可見,此時input_of_inout和output_of_inout就可以當作普通信號使用了库正。

在仿真的時候曲楚,需要注意雙向口的處理。如果是直接與另外一個模塊的雙向口連接褥符,那么只要保證一個模塊在輸出的時候龙誊,另外一個模塊沒有輸出(處于高阻態(tài))就可以了。

如果是在ModelSim中作為單獨的模塊仿真喷楣,那么在模塊輸出的時候趟大,不能使用force命令將其設為高阻態(tài)鹤树,而是使用release命令將總線釋放掉

很多初學者在寫testbench進行仿真和驗證的時候,被inout雙向口難住了逊朽。仿真器老是提示錯誤不能進行罕伯。下面是我個人對inout端口寫 testbench仿真的一些總結(jié),并舉例進行說明叽讳。在這里先要說明一下inout口在testbench中要定義為wire型變量追他。

先假設有一源代碼為:

module xx(data_inout , ........);

inout data_inout;

........................

assign data_inout=(! link)?datareg:1'bz;

endmodule

方法一:使用相反控制信號inout口,等于兩個模塊之間用inout雙向口互連绽榛。這種方法要注意assign 語句只能放在initial和always塊內(nèi)湿酸。

module test();

wire data_inout;

reg data_reg;

reg link;

initial begin

..........

end

assign data_inout=link?data_reg:1'bz;

endmodule

方法二:使用force和release語句,但這種方法不能準確反映雙向端口的信號變化灭美,但這種方法可以反在塊內(nèi)推溃。

module test();

wire data_inout;

reg data_reg;

reg link;

#xx; ?? ??? //延時

force data_inout=1'bx; ?? ?? ??? //強制作為輸入端口

...............

#xx;

release data_inout; ?? ?? //釋放輸入端口

endmodule

很多讀者反映仿真雙向端口的時候遇到困難,這里介紹一下雙向端口的仿真方法届腐。一個典型的雙向端口如圖1所示铁坎。

其中inner_port與芯片內(nèi)部其他邏輯相連,outer_port為芯片外部管腳犁苏,out_en用于控制雙向端口的方向硬萍,out_en為1時,端口為輸出方向围详,out_en為0時朴乖,端口為輸入方向。

用Verilog語言描述如下:

module bidirection_io(inner_port,out_en,outer_port);

input out_en;

inout[7:0] inner_port;

inout[7:0] outer_port;

assign outer_port=(out_en==1)?inner_port:8'hzz;

assign inner_port=(out_en==0)?outer_port:8'hzz;

endmodule

用VHDL語言描述雙向端口如下:

library ieee;

use IEEE.STD_LOGIC_1164.ALL;

entity bidirection_io is

port ( inner_port : inout std_logic_vector(7 downto 0);

out_en : in std_logic;

outer_port : inout std_logic_vector(7 downto 0) );

end bidirection_io;

architecture behavioral of bidirection_io is

begin

outer_port<=inner_port when out_en='1' else (OTHERS=>'Z');

inner_port<=outer_port when out_en='0' else (OTHERS=>'Z');

end behavioral;

仿真時需要驗證雙向端口能正確輸出數(shù)據(jù)助赞,以及正確讀入數(shù)據(jù)买羞,因此需要驅(qū)動out_en端口,當out_en端口為1時雹食,testbench驅(qū)動 inner_port端口畜普,然后檢查outer_port端口輸出的數(shù)據(jù)是否正確;當out_en端口為0時群叶,testbench驅(qū)動 outer_port端口吃挑,然后檢查inner_port端口讀入的數(shù)據(jù)是否正確。由于inner_port和outer_port端口都是雙向端口(在 VHDL和Verilog語言中都用inout定義)街立,因此驅(qū)動方法與單向端口有所不同舶衬。

驗證該雙向端口的testbench結(jié)構(gòu)如圖2所示。

這是一個self-checking testbench几晤,可以自動檢查仿真結(jié)果是否正確约炎,并在Modelsim控制臺上打印出提示信息。圖中Monitor完成信號采樣蟹瘾、結(jié)果自動比較的功能圾浅。

testbench的工作過程為

1)out_en=1時,雙向端口處于輸出狀態(tài)憾朴,testbench給inner_port_tb_reg信號賦值狸捕,然后讀取outer_port_tb_wire的值,如果兩者一致众雷,雙向端口工作正常灸拍。

2)out_en=0時,雙向端口處于輸如狀態(tài)砾省,testbench給outer_port_tb_reg信號賦值鸡岗,然后讀取inner_port_tb_wire的值,如果兩者一致编兄,雙向端口工作正常轩性。

用Verilog代碼編寫的testbench如下,其中使用了自動結(jié)果比較狠鸳,隨機化激勵產(chǎn)生等技術(shù)揣苏。

`timescale 1ns/10ps

module tb();

reg[7:0] inner_port_tb_reg;

wire[7:0] inner_port_tb_wire;

reg[7:0] outer_port_tb_reg;

wire[7:0] outer_port_tb_wire;

reg out_en_tb;

integer i;

initial

begin

out_en_tb=0;

inner_port_tb_reg=0;

outer_port_tb_reg=0;

i=0;

repeat(20)

begin

#50

i=$random;

out_en_tb=i[0]; //randomize out_en_tb

inner_port_tb_reg=$random; //randomize data

outer_port_tb_reg=$random;

end

end

//**** drive the ports connecting to bidirction_io

assign inner_port_tb_wire=(out_en_tb==1)?inner_port_tb_reg:8'hzz;

assign outer_port_tb_wire=(out_en_tb==0)?outer_port_tb_reg:8'hzz;

//instatiate the bidirction_io module

bidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),

.out_en(out_en_tb),

.outer_port(outer_port_tb_wire));

//***** monitor ******

always@(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)

begin

#1;

if(outer_port_tb_wire===inner_port_tb_wire)

begin

$display("\n **** time=%t ****",$time);

$display("OK! out_en=%d",out_en_tb);

$display("OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d",

outer_port_tb_wire,inner_port_tb_wire);

end

else

begin

$display("\n **** time=%t ****",$time);

$display("ERROR! out_en=%d",out_en_tb);

$display("ERROR! outer_port_tb_wire != inner_port_tb_wire" );

$display("ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d",

outer_port_tb_wire,inner_port_tb_wire);

end

end

endmodule

6. 高級用法

比如pli之類的東西,我也沒用過件舵。卸察。。有需要的铅祸,大家再討論

總體感覺坑质,testbench是個很難的事情,這里討論的只是一些最基本的東西临梗。真正有技術(shù)含量的是testcase的設計涡扼,設計階段合理層次設計以及模 塊劃分等等,我沒有做過很大的項目夜焦,所以這方面也沒有辦法提供更多的幫助壳澳。經(jīng)驗豐富的大牛不妨出來講講經(jīng)驗,^_^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茫经,一起剝皮案震驚了整個濱河市巷波,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸伞,老刑警劉巖抹镊,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荤傲,居然都是意外死亡垮耳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來终佛,“玉大人俊嗽,你說我怎么就攤上這事×逭茫” “怎么了绍豁?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牙捉。 經(jīng)常有香客問我竹揍,道長,這世上最難降的妖魔是什么邪铲? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任芬位,我火速辦了婚禮,結(jié)果婚禮上带到,老公的妹妹穿的比我還像新娘昧碉。我一直安慰自己,他們只是感情好阴孟,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布晌纫。 她就那樣靜靜地躺著,像睡著了一般永丝。 火紅的嫁衣襯著肌膚如雪误续。 梳的紋絲不亂的頭發(fā)上因惭,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天婿牍,我揣著相機與錄音非迹,去河邊找鬼。 笑死喝检,一個胖子當著我的面吹牛嗅辣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挠说,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼澡谭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了损俭?” 一聲冷哼從身側(cè)響起蛙奖,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杆兵,沒想到半個月后雁仲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡琐脏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年攒砖,在試婚紗的時候發(fā)現(xiàn)自己被綠了缸兔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡吹艇,死狀恐怖惰蜜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掐暮,我是刑警寧澤蝎抽,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布政钟,位于F島的核電站路克,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏养交。R本人自食惡果不足惜精算,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碎连。 院中可真熱鬧灰羽,春花似錦、人聲如沸鱼辙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倒戏。三九已至怠噪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杜跷,已是汗流浹背傍念。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葛闷,地道東北人憋槐。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像淑趾,于是被迫代替她去往敵國和親阳仔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扣泊,服務發(fā)現(xiàn)近范,斷路器,智...
    卡卡羅2017閱讀 134,667評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法旷赖,類相關(guān)的語法顺又,內(nèi)部類的語法,繼承相關(guān)的語法等孵,異常的語法稚照,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • 10#數(shù)據(jù)類型 合并數(shù)組和非合并數(shù)組 合并數(shù)組:存儲方式是連續(xù)的,中間沒有閑置空間。例如果录,32bit的寄存器上枕,可以...
    constant007閱讀 32,965評論 0 18
  • 昨天辨萍,我的大學室友給我發(fā)來一屏幕的微信語音 大致的意思是,她有一個又丑又丑的同學返弹,通過整容把自己變成白富美锈玉,還有一...
    呼啦來了閱讀 486評論 0 0
  • 小美最近發(fā)現(xiàn)房間好像不止她一個人。她的家遠在一個三線城市义起,大學畢業(yè)之后只身來到A市開始了租房生涯拉背。每月工資只有40...
    才賦裴伴_阿裴閱讀 818評論 7 5