Tips

赋值

①"always"模块内的reg型信号如果采用下面的这种赋值方式:

b <= a; 

这种方式的赋值并不是马上执行的,也就是说"always"块内的下一条语句执行后,b并不等于a,而是保持原来的值。"always"块结束后,才进行赋值。
②另一种赋值方式阻塞赋值方式,如下所示:

b = a; 

这种赋值方式是马上执行的。也就是说执行下一条语句时,b已等于a。

模块

①在描述模块功能时,input只能为wire型,output可以为wire或者reg型
②在例化模块时,被例化模块的input可以为wire或者reg型,output只能为wire型

Verilog Code

`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
    wire odd, even;
    assign even = ^bus;
    assign odd = ~even;
    reg check_t;
    always @(sel or bus) begin
        if(!sel) begin
            check_t = odd;
        end
        else begin
            check_t = even;
        end
    end
    assign check = check_t;
//*************code***********//
endmodule

Testbench Code

`timescale 1ns/1ns
module testbench();
	reg clk=0;
	always #5 clk = ~clk;  // Create clock with period=10
// A testbench
    reg [31:0] bus = 0;
    reg sel = 0;
    wire check;
    odd_sel t(.bus(bus),
              .sel(sel),
              .check(check));
    always begin
        #20 sel = ~sel;
    end
    always begin
        #20 bus++;
    end
//end    
    initial begin
        $dumpfile("out.vcd");
        $dumpvars(0, testbench);
        #200 $finish;
    end
endmodule