天天看點

“always @(*)”中‘*’所代表的意思

1.在Verilog中,'*'隻包括該子產品中的所有型号,沒在該子產品中出現的信号不包含于'*'。

在絕大多數變成語言中,'*'都是表示包括所有可能,那麼在Verilog中是不是也一樣呢?為此,我用modelsim做了一個實驗。

//被測試的電路                                             

module  test(in,en,rst_n,out);

input     [1:0]     in;

input             en;

input     [1:0]     rst_n;

output   [3:0]     out;

reg         [3:0]     out;

always  @(*)begin

  if(!rst_n)

    out=0;

  else

    out=out+in;

end

endmodule

//測試電路,testbench

``timescale 10ps/1ps

module  test_tb;

reg   [1:0]   in;

reg           en;

reg   [1:0]   rst_n;

wire  [3:0]   out;

initial begin

  #1  in=1;

  #1  en=0;

  #1  rst_n=1;

  #1  rst_n=0;

  #1  rst_n=1;

  #1  rst_n=2;

  #1  rst_n=3;

  #1  in=1;

  #1  in=2;

  #1  in=3;

end

always  #1  en=~en;

test test_top(in,en,rst_n,out);

endmodule

說明:這裡,被測試的電路中,輸出out等于其本身加上輸入in,但要在'*'的激發下才能進行;在testbench  電 路中,首先複位并初始化各個信号的值,然後再改變各個信号的值,觀察out值的變化,以此來确定'*'所代表的信号。

由仿真後的波形中可以看出:(1)當rst_n複位後,也就是從1變成0時,out變成0,而out指派語句是包含在always @(*)中的,這就說明rst_n的變化激發了always子產品的執行,則rst_n信号是包含在'*'中的。後面,rst_n每變一次值,out都加上in的值,也證明了'*'包括了rst_n信号。(2)之後,in每變一次值,always子產品都執行一次,out都加上了此時的in值,則說明'*'也包括了in信号。(3)再往後,en不停的從0變成1再變成0,但out的值始終沒變,則說明'*'不包括en信号。

繼續閱讀