11.8 Control StatementsIn this section we
shall discuss the Verilog 11.8.1 Case and If StatementAn if statement
[Verilog LRM 9.4] represents a two-way branch. In the following example, if(switch) Y = 1; else Y = 0; The case statement [Verilog LRM 9.5] represents a multiway branch. A controlling expression is matched with case expressions in each of the case items (or arms) to determine a match, module test_mux; reg a, b, select; wire out; mux mux_1(a, b, out, select); initial begin #2; select = 0; a = 0; b = 1; #2; select = 1'bx; #2; select = 1'bz; #2; select = 1; end initial ("T=%2g",," Select=",select," Out=",out); initial #10 ; endmodule module mux(a, b, mux_output, mux_select); input a, b, mux_select; output mux_output; reg mux_output; always begin case(mux_select) 0: mux_output = a; 1: mux_output = b; default mux_output = 1'bx; // If select = x or z set output to x. endcase #1; // Need some delay, otherwise we'll spin forever. end endmodule T= 0 Select=x Out=x T= 2 Select=0 Out=x T= 3 Select=0 Out=0 T= 4 Select=x Out=0 T= 5 Select=x Out=x T= 6 Select=z Out=x T= 8 Select=1 Out=x T= 9 Select=1 Out=1 Notice that the casex (instruction_register[31:29]) 3b'??1 : add; 3b'?1? : subtract; 3b'1?? : branch; endcase 11.8.2 Loop StatementA loop statement [Verilog LRM 9.6] is a for, while, repeat, or forever statement. Here are four examples, one for each different type of loop statement, each of which performs the same function. The comments with each type of loop statement illustrate how the controls work: module loop_1; integer i; reg [31:0] DataBus; initial DataBus = 0; initial begin /************** Insert loop code after here. ******************/ /* for(Execute this assignment once before starting loop; exit loop if this expression is false; execute this assignment at end of loop before the check for end of loop.) */ for(i = 0; i <= 15; i = i+1) DataBus[i] = 1; /*************** Insert loop code before here. ****************/ end initial begin ("DataBus = %b",DataBus); #2; ("DataBus = %b",DataBus); ; end endmodule Here is the i = 0; /* while(Execute next statement while this expression is true.) */ while(i <= 15) begin DataBus[i] = 1; i = i+1; end Here is the i = 0; /* repeat(Execute next statement the number of times corresponding to the evaluation of this expression at the beginning of the loop.) */ repeat(16) begin DataBus[i] = 1; i = i+1; end Here is the i = 0; /* A forever statement loops continuously. */ forever begin : my_loop DataBus[i] = 1; if (i == 15) #1 disable my_loop; // Need to let time advance to exit. i = i+1; end The output for all four forms of looping statement is the same: DataBus = 00000000000000000000000000000000 DataBus = 00000000000000001111111111111111 11.8.3 DisableThe disable statement [Verilog LRM 11] stops the execution of a labeled sequential block and skips to the end of the block: forever begin: microprocessor_block // Labeled sequential block. @(posedge clock) if (reset) disable microprocessor_block; // Skip to end of block. else Execute_code; end Use the 11.8.4 Fork and JoinThe fork statement and join statement [Verilog LRM 9.8.2] allows the execution of two or more parallel threads in a parallel block: module fork_1 event eat_breakfast, read_paper; initial begin fork @eat_breakfast; @read_paper; join end endmodule This is another Verilog language feature that should be used with care in ASIC design, because it is difficult to implement in hardware. |
|||||
|
|||||
|