Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

Task And Function part 1

E-mail Print PDF

Task

Tasks are used in all programming languages, generally known as procedures or subroutines. The lines of code are enclosed in task....end task brackets. 

Data is passed to the task, the processing done, and the result returned. They have to be specifically called, with data ins and outs, rather than just wired in to the general netlist. Included in the main body of code, they can be called many times, reducing code repetition.

  • tasks are defined in the module in which they are used. It is possible to define a task in a separate file and use the compile directive 'include to include the task in the file which instantiates the task.
  • tasks can include timing delays, like posedge, negedge, # delay and wait.
  • tasks can have any number of inputs and outputs.
  • The variables declared within the task are local to that task. The order of declaration within the task defines how the variables passed to the task by the caller are used.
  • tasks can take, drive and source global variables, when no local variables are used. When local variables are used, basically output is assigned only at the end of task execution.
  • tasks can call another task or function.
  • tasks can be used for modeling both combinational and sequential logic.
  • A task must be specifically called with a statement, it cannot be used within an expression as a function can.

Syntax

  • A task begins with keyword task and ends with keyword endtask
  • Inputs and outputs are declared after the keyword task.
  • Local variables are declared after input and output declaration.
Example - Simple 
1 module simple_task();

  2

  3 task convert;

  4 input [7:0] temp_in;

  5 output [7:0] temp_out;

  6 begin

  7   temp_out = (9/5) *( temp_in + 32)

  8 end

  9 endtask

 10

 11 endmodule

Example - Task using Global Variables

  1 module task_global();

  2

  3 reg [7:0] temp_out;

  4 reg [7:0] temp_in;

  5

  6 task convert;

  7 begin

  8   temp_out = (9/5) *( temp_in + 32);

  9 end

 10 endtask

 11

 12 endmodule

Calling a Task
Let's assume that the task in example 1 is stored in a file called mytask.v. Advantage of coding a task in a separate file, is that it can be used in multiple modules.

  1 module  task_calling (temp_a, temp_b, temp_c, temp_d);

  2 input [7:0] temp_a, temp_c;

  3 output [7:0] temp_b, temp_d;

  4 reg [7:0] temp_b, temp_d;

  5 `include "mytask.v"

  6      

  7 always @ (temp_a)

  8 begin      

  9   convert (temp_a, temp_b);

 10 end 

 11

 12 always @ (temp_c)

 13 begin      

 14   convert (temp_c, temp_d);

 15 end 

 16      

 17 endmodule

Example - CPU Write / Read Task

Below is the waveform used for writing into memory and reading from memory. We make the assumption that there is a need to use this interface from multiple agents. So we write the read/write as tasks.

  1 module bus_wr_rd_task();

  2

  3 reg clk,rd,wr,ce;

  4 reg [7:0]  addr,data_wr,data_rd;

  5 reg [7:0]  read_data;

  6

  7 initial begin

  8   clk = 0;

  9   read_data = 0;

 10   rd = 0;

 11   wr = 0;

 12   ce = 0;

 13   addr = 0;

 14   data_wr = 0;

 15   data_rd = 0;

 16   // Call the write and read tasks here

 17    #1  cpu_write(8'h11,8'hAA);

 18    #1  cpu_read(8'h11,read_data);

 19    #1  cpu_write(8'h12,8'hAB);

 20    #1  cpu_read(8'h12,read_data);

 21    #1  cpu_write(8'h13,8'h0A);

 22    #1  cpu_read(8'h13,read_data);

 23    #100  $finish;

 24 end

 25 // Clock Generator

 26 always

 27    #1  clk = ~clk;

 28 // CPU Read Task

 29 task cpu_read;

 30   input [7:0]  address;

 31   output [7:0] data;

 32   begin

 33     $display ("%g CPU Read  task with address : %h", $time, address);

 34     $display ("%g  -> Driving CE, RD and ADDRESS on to bus", $time);

 35     @ (posedge clk);

 36     addr = address;

 37     ce = 1;

 38     rd = 1;

 39     @ (negedge clk);

 40     data = data_rd;

 41     @ (posedge clk);

 42     addr = 0;

 43     ce = 0;

 44     rd = 0;

 45     $display ("%g CPU Read  data              : %h", $time, data);

 46     $display ("======================");

 47   end

 48 endtask

 49 // CU Write Task

 50 task cpu_write;

 51   input [7:0]  address;

 52   input [7:0] data;

 53   begin

 54     $display ("%g CPU Write task with address : %h Data : %h",

 55       $time, address,data);

 56     $display ("%g  -> Driving CE, WR, WR data and ADDRESS on to bus",

 57       $time);

 58     @ (posedge clk);

 59     addr = address;

 60     ce = 1;

 61     wr = 1;

 62     data_wr = data;

 63     @ (posedge clk);

 64     addr = 0;

 65     ce = 0;

 66     wr = 0;

 67     $display ("======================");

 68   end

 69 endtask

 70

 71 // Memory model for checking tasks

 72 reg [7:0] mem [0:255];

 73

 74 always @ (addr or ce or rd or wr or data_wr)

 75 if (ce) begin

 76   if (wr) begin

 77     mem[addr] = data_wr;

 78   end

 79   if (rd) begin

 80     data_rd = mem[addr];

 81   end

 82 end

 83

 84 endmodule

Simulation Output

 1 CPU Write task with address : 11 Data : aa

 1  -> Driving CE, WR, WR data and ADDRESS on to bus

 ======================

 4 CPU Read  task with address : 11

 4  -> Driving CE, RD and ADDRESS on to bus

 7 CPU Read  data              : aa

 ======================

 8 CPU Write task with address : 12 Data : ab

 8  -> Driving CE, WR, WR data and ADDRESS on to bus

 ======================

 12 CPU Read  task with address : 12

 12  -> Driving CE, RD and ADDRESS on to bus

 15 CPU Read  data              : ab

 ======================

 16 CPU Write task with address : 13 Data : 0a

 16  -> Driving CE, WR, WR data and ADDRESS on to bus

 ======================

 20 CPU Read  task with address : 13

 20  -> Driving CE, RD and ADDRESS on to bus

 23 CPU Read  data              : 0a

 ======================

  Bạn Có Đam Mê Với Vi Mạch hay Nhúng      -     Bạn Muốn Trau Dồi Thêm Kĩ Năng

Mong Muốn Có Thêm Cơ Hội Trong Công Việc

Và Trở Thành Một Người Có Giá Trị Hơn

Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng

Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON  

Last Updated ( Tuesday, 29 March 2022 00:58 )  

Related Articles

Chat Zalo