Verilog HDL:Digital Design and Modeling Chapter 10 Tasks and - - PDF document

verilog hdl digital design and modeling chapter 10 tasks
SMART_READER_LITE
LIVE PREVIEW

Verilog HDL:Digital Design and Modeling Chapter 10 Tasks and - - PDF document

Chapter 10 Tasks and Functions 1 Verilog HDL:Digital Design and Modeling Chapter 10 Tasks and Functions Chapter 10 Tasks and Functions 2 Page 584 //module to illustrate a task module task_arith_log; reg [7:0] a, b, c; reg


slide-1
SLIDE 1

Chapter 10 Tasks and Functions 1

Verilog HDL:Digital Design and Modeling Chapter 10 Tasks and Functions

slide-2
SLIDE 2

Chapter 10 Tasks and Functions 2

Page 584

//module to illustrate a task module task_arith_log; reg [7:0] a, b, c; reg [7:0] z1, z2, z3, z4; initial begin a=8'b0000_1111; b=8'b0011_1100; c=8'b0101_0101; calc (a, b, c, z1, z2, z3, z4); //invoke task a=8'b1111_1111; b=8'b0000_1100; c=8'b1011_1101; calc (a, b, c, z1, z2, z3, z4); //invoke task a=8'b0011_1100; b=8'b0001_1101; c=8'b1010_0101; calc (a, b, c, z1, z2, z3, z4); //invoke task a=8'b1100_1001; b=8'b1011_1101; c=8'b0111_0111; calc (a, b, c, z1, z2, z3, z4); //invoke task end task calc; input [7:0] a, b, c;

  • utput [7:0] z1, z2, z3, z4;

begin z1 = (a + b) & (c); z2 = (a + b) | (c); z3 = (a & b) + (c); z4 = (a | b) + (c); $display ("a=%b, b=%b, c=%b, z1=%b, z2=%b, z3=%b, z4=%b", a, b, c, z1, z2, z3, z4); end endtask endmodule

Figure 10.1 Module for the task of Example 10.1.

slide-3
SLIDE 3

Chapter 10 Tasks and Functions 3

Page 585

a=00001111, b=00111100, c=01010101, z1=01000001, z2=01011111, z3=01100001, z4=10010100 a=11111111, b=00001100, c=10111101, z1=00001001, z2=10111111, z3=11001001, z4=10111100 a=00111100, b=00011101, c=10100101, z1=00000001, z2=11111101, z3=11000001, z4=11100010 a=11001001, b=10111101, c=01110111, z1=00000110, z2=11110111, z3=00000000, z4=01110100

Figure 10.2 Outputs for the task module of Figure 10.2.

slide-4
SLIDE 4

Chapter 10 Tasks and Functions 4

Page 586

//module to illustrate a task for logical operations module task_logical; reg [7:0] a, b; reg [7:0] a_and_b, a_nand_b, a_or_b, a_nor_b, a_xor_b, a_xnor_b; initial begin a=8'b1010_1010; b=8'b1100_1100; logical (a, b, a_and_b, a_nand_b, a_or_b, a_nor_b, a_xor_b, a_xnor_b); //invoke the task a=8'b1110_0111; b=8'b1110_0111; logical (a, b, a_and_b, a_nand_b, a_or_b, a_nor_b, a_xor_b, a_xnor_b); //invoke the task a=8'b0000_0111; b=8'b0000_0111; logical (a, b, a_and_b, a_nand_b, a_or_b, a_nor_b, a_xor_b, a_xnor_b); //invoke the task a=8'b0101_0101; b=8'b1010_1010; logical (a, b, a_and_b, a_nand_b, a_or_b, a_nor_b, a_xor_b, a_xnor_b); //invoke the task end task logical; input [7:0] a, b;

  • utput [7:0] a_and_b, a_nand_b, a_or_b, a_nor_b,

a_xor_b, a_xnor_b; begin a_and_b = a & b; a_nand_b = ~(a & b); a_or_b = a | b; a_nor_b = ~(a | b); a_xor_b = a ^ b; a_xnor_b = ~(a ^ b); $display ("a=%b, b=%b, a_and_b=%b, a_nand_b=%b, a_or_b=%b, a_nor_b=%b, a_xor_b=%b, a_xnor_b=%b", a, b, a_and_b, a_nand_b, a_or_b, a_nor_b, a_xor_b, a_xnor_b); end endtask endmodule

Figure 10.5 Module for the task of Example 10.2.

slide-5
SLIDE 5

Chapter 10 Tasks and Functions 5

Page 587

a=10101010, b=11001100, a_and_b=10001000, a_nand_b=01110111, a_or_b=11101110, a_nor_b=00010001, a_xor_b=01100110, a_xnor_b=10011001 a=11100111, b=11100111, a_and_b=11100111, a_nand_b=00011000, a_or_b=11100111, a_nor_b=00011000, a_xor_b=00000000, a_xnor_b=11111111 a=00000111, b=00000111, a_and_b=00000111, a_nand_b=11111000, a_or_b=00000111, a_nor_b=11111000, a_xor_b=00000000, a_xnor_b=11111111 a=01010101, b=10101010, a_and_b=00000000, a_nand_b=11111111, a_or_b=11111111, a_nor_b=00000000, a_xor_b=11111111, a_xnor_b=00000000

Figure 10.6 Outputs for the task module of Figure 10.5.

slide-6
SLIDE 6

Chapter 10 Tasks and Functions 6

Page 588

//module to illustrate the use of a task module task1_adder4; integer a, b, cin, sum; initial begin a=2; b=5; cin=0; add (a, b, cin, sum); //invoke the task a=3; b=2; cin=1; add (a, b, cin, sum); //invoke the task a=4; b=6; cin=1; add (a, b, cin, sum); //invoke the task a=14; b=63; cin=1; add (a, b, cin, sum); //invoke the task a=150; b=225; cin=0; add (a, b, cin, sum); //invoke the task end task add; input a; input b; input cin;

  • utput sum;

integer a, b, cin, sum; begin sum = a + b + cin; $display ("a=%d, b=%d, cin=%d, sum=%d", a, b, cin, sum); end endtask endmodule

Figure 10.8 Module for the task of Example 10.3.

a = 2, b = 5, cin = 0, sum = 7 a = 3, b = 2, cin = 1, sum = 6 a = 4, b = 6, cin = 1, sum = 11 a = 14, b = 63, cin = 1, sum = 78 a = 150, b = 225, cin = 0, sum = 375

Figure 10.9 Outputs for the task module of Figure 10.8.

slide-7
SLIDE 7

Chapter 10 Tasks and Functions 7

Page 590

//module to illustrate a function module fctn_parity; reg [15:0] addr; reg parity; initial begin parity = calc_parity (16’b1111_0000_1111_0000); if (parity ==1) $display ("parity is even"); else $display ("parity is odd"); parity = calc_parity (16’b1111_0000_1111_0001); if (parity ==1) $display ("parity is even"); else $display ("parity is odd"); end function calc_parity; input [15:0] address; begin calc_parity = ^address; end endfunction endmodule

Figure 10.11 Module for the function of Example 10.4.

parity is even parity is odd

Figure 10.12 Outputs for the function module of Figure 10.11.

slide-8
SLIDE 8

Chapter 10 Tasks and Functions 8

Page 592

//module to illustrate a function module fctn_count1s; reg [3:0] count; //invoke the function initial begin count = count1s (8'b1100_0011); $display ("number of 1s = %d", count); count = count1s (8'b1101_0011); $display ("number of 1s = %d", count); count = count1s (8'b1111_1011); $display ("number of 1s = %d", count); count = count1s (8'b1010_1010); $display ("number of 1s = %d", count); count = count1s (8'b0000_0000); $display ("number of 1s = %d", count); count = count1s (8'b0000_0010); $display ("number of 1s = %d", count); count = count1s (8'b1111_1111); $display ("number of 1s = %d", count); count = count1s (8'b0110_0100); $display ("number of 1s = %d", count); end //continue on next page

Figure 10.13 Module for a function to count the number of 1s in a word.

slide-9
SLIDE 9

function [3:0] count1s; input [7:0] reg_a; reg [3:0] cnt; begin cnt = 0; while (reg_a) begin cnt = cnt + reg_a[0]; reg_a = reg_a >> 1; end count1s = cnt; end endfunction endmodule Chapter 10 Tasks and Functions 9

Figure 10.13 (Continued)

number of 1s = 4 number of 1s = 5 number of 1s = 7 number of 1s = 4 number of 1s = 0 number of 1s = 1 number of 1s = 8 number of 1s = 3

Figure 10.14 Outputs for a function to count the number of 1s in a word.

//module for a full adder using a function module fctn_full_add; reg a, b, cin; reg [1:0] sum; initial begin sum = full_add (1'b0, 1'b0, 1'b0); //invoke the function $display ("abcin=000, cout, sum = %b", sum); sum = full_add (1'b0, 1'b0, 1'b1); $display ("abcin=001, cout, sum = %b", sum); //continued on next page

Page 594 Figure 10.16 Module for the full adder function of Example 10.6.

slide-10
SLIDE 10

sum = full_add (1'b0, 1'b1, 1'b0); $display ("abcin=010, cout, sum = %b", sum); sum = full_add (1'b0, 1'b1, 1'b1); $display ("abcin=011, cout, sum = %b", sum); sum = full_add (1'b1, 1'b0, 1'b0); $display ("abcin=100, cout, sum = %b", sum); sum = full_add (1'b1, 1'b0, 1'b1); $display ("abcin=101, cout, sum = %b", sum); sum = full_add (1'b1, 1'b1, 1'b0); $display ("abcin=110, cout, sum = %b", sum); sum = full_add (1'b1, 1'b1, 1'b1); $display ("abcin=111, cout, sum = %b", sum); end function [2:0] full_add; input a, b, cin; reg [1:0] sum; begin case ({a,b,cin}) 3'b000: sum = 2'b00; 3'b001: sum = 2'b01; 3'b010: sum = 2'b01; 3'b011: sum = 2'b10; 3'b100: sum = 2'b01; 3'b101: sum = 2'b10; 3'b110: sum = 2'b10; 3'b111: sum = 2'b11; default:sum = 2'bxx; endcase full_add = sum; end endfunction endmodule Chapter 10 Tasks and Functions 10

Figure 10.16 (Continued)

slide-11
SLIDE 11

Chapter 10 Tasks and Functions 11

Page 596

abcin=000, cout, sum = 00 abcin=001, cout, sum = 01 abcin=010, cout, sum = 01 abcin=011, cout, sum = 10 abcin=100, cout, sum = 01 abcin=101, cout, sum = 10 abcin=110, cout, sum = 10 abcin=111, cout, sum = 11

Figure 10.17 Outputs for the full adder function module of Figure 10.16.

slide-12
SLIDE 12

Chapter 10 Tasks and Functions 12

Page 596

//module for a shifter using a function module fctn_shifter; reg [7:0] left_word, right_word; reg ctrl; initial begin left_word = shift (8'b1010_1010, 1'b0);//invoke function $display ("word = %b", left_word); right_word = shift (8'b1100_0011, 1'b1); $display ("word = %b", right_word); left_word = shift (8'b0000_1111, 1'b0); $display ("word = %b", left_word); right_word = shift (8'b0000_1111, 1'b1); $display ("word = %b", right_word); left_word = shift (8'b0010_0000, 1'b0); $display ("word = %b", left_word); right_word = shift (8'b0010_0000, 1'b1); $display ("word = %b", right_word); end function [7:0] shift; input [7:0] word; input ctrl; begin shift = (ctrl == 1'b0) ? (word << 1) : (word >> 1); end endfunction endmodule

Figure 10.18 Module for a function to shift a word left or right 1 bit position.

word = 01010100 word = 01100001 word = 00011110 word = 00000111 word = 01000000 word = 00010000

Page 597 Figure 10.19 Outputs for the shift function module of Figure 10.18.

slide-13
SLIDE 13

Chapter 10 Tasks and Functions 13

Page 598

//module for an arithmetic and logic unit using a function module fctn_alu; reg [7:0] a, b; reg [1:0] mode; reg [15:0] rslt; initial begin rslt = alu (8'b0000_1111, 8'b0000_0011, 2'b00); $display ("add, a=0000_1111, b=0000_0011, rslt = %b", rslt); rslt = alu (8'b0011_1101, 8'b0010_0011, 2'b00); $display ("add, a=0011_1101, b=0010_0011, rslt = %b", rslt); rslt = alu (8'b0000_1111, 8'b0000_0011, 2'b01); $display ("sub, a=0000_1111, b=0000_0011, rslt = %b", rslt); rslt = alu (8'b0000_1111, 8'b0001_0000, 2'b01); $display ("sub, a=0000_1111, b=0001_0000, rslt = %b", rslt); rslt = alu (8'b0000_1111, 8'b0000_0011, 2'b10); $display ("mul, a=0000_1111, b=0000_0011, rslt = %b", rslt); rslt = alu (8'b0000_1111, 8'b0001_1001, 2'b10); $display ("mul, a=0000_1111, b=0001_1001, rslt = %b", rslt); rslt = alu (8'b0000_1111, 8'b0000_0011, 2'b11); $display ("div, a=0000_1111, b=0000_0011, rslt = %b", rslt); rslt = alu (8'b0011_0111, 8'b0000_0111, 2'b11); $display ("div, a=0011_0111, b=0000_0111, rslt = %b", rslt); end //continued on next page

Figure 10.21 Module to implement a function for a 4-operation ALU.

slide-14
SLIDE 14

function [15:0] alu; input [7:0] a, b; input [1:0] mode; reg [15:0] rslt; begin case (mode) 2'b00: rslt = a + b; 2'b01: rslt = a - b; 2'b10: rslt = a * b; 2'b11: rslt = a / b; default: rslt = 16'bxxxx_xxxx_xxxx_xxxx; endcase alu = rslt; end endfunction endmodule Chapter 10 Tasks and Functions 14

Figure 10.21 (Continued) Page 599

add, a=0000_1111, b=0000_0011, rslt = 0000000000010010 add, a=0011_1101, b=0010_0011, rslt = 0000000001100000 sub, a=0000_1111, b=0000_0011, rslt = 0000000000001100 sub, a=0000_1111, b=0001_0000, rslt = 1111111111111111 mul, a=0000_1111, b=0000_0011, rslt = 0000000000101101 mul, a=0000_1111, b=0001_1001, rslt = 0000000101110111 div, a=0000_1111, b=0000_0011, rslt = 0000000000000101 div, a=0011_0111, b=0000_0111, rslt = 0000000000000111

Figure 10.22 Outputs for Figure 10.21, which implements a 4-operation ALU.

slide-15
SLIDE 15

Chapter 10 Tasks and Functions 15

slide-16
SLIDE 16

Chapter 10 Tasks and Functions 16