You are on page 1of 18

Lecture 5

Systemverilog 1
Memory Read

❑Summarize FIFO design? Why did we study FIFO design?

❑What are the main advantages of Systemverilog?

❑ What is an Interface in Systemverilog?


Threads in SystemVerilog
fork… join
fork-join: waits for all parallel processes to complete before
continuing the sequential process. initial begin
#10ns;
fork
fork
Spawn concurrent processes from a begin
single process: #20ns;
$display( “A\n" );
▪ A is printed at 30ns; end
▪ B at 20ns; begin
▪ the last display takes place at 40ns #10ns;
$display( “B\n" );
#20ns;
Join waits until both sub-processes join
have finished, end
join
$display(both finished);
end
Dynamic Processes
Inspired by the need for software verification environments to dynamically start and stop threads,
SystemVerilog defines 2 new special cases of fork…join with associated keywords join_any & join_none

join_any join_none

begin
fork
fork

other blocks …
… continue as dynamic
join_none // no waiting at all
… threads
@(sig1);
join_any // any block finished end
fork… join : Example 1
initial begin

$display("**********Before Fork..Join *********");


**********Before Fork..Join *********
fork 2 Thread D
#15 $display($time,"\t Thread A"); 5 Thread B
#5 $display($time,"\t Thread B"); 10 Thread C
#10 $display($time,"\t Thread C"); 15 Thread A
#2 $display($time,"\t Thread D"); 22 Thread E
join **********After Fork..Join**********

#7 $display($time,"\t Thread E");

$display("**********After Fork..Join**********");

$finish;
end
fork… join : Example 2
initial begin

$display("**********Before Fork..Join *********");


**********Before Fork..Join *********
fork 10 Thread C
begin 15 Thread A
#15 $display($time,"\tThread A"); 20 Thread B
#5 $display($time,"\tThread B"); 22 Thread D
end 29 Thread E
begin **********After Fork..Join**********
#10 $display($time,"\tThread C");
#12 $display($time,"\tThread D");
end
join

#7 $display($time,"\tThread E");

$display("**********After Fork..Join**********");
fork… join_any: Example 1

initial begin
fork-join_any: waits for the first of
$display("********Before Fork..Join_any********"); all the parallel processes to complete
before continuing the sequential process
fork
#15 $display($time,"\tThread A");
#5 $display($time,"\tThread B");
#10 $display($time,"\tThread C");
Join_any
********Before Fork..Join_any********
#2 $display($time,"\tThread D"); 5 Thread B
#12 $display($time,"\tThread E"); 7 Thread D
10 Thread C
$display("********After Fork..Join_any**********"); 15 Thread A
19 Thread E
end ********After Fork..Join_any**********
fork… join_any: Example 2
initial begin

$display("********Before Fork..Join_any********");
****** Before Fork..Join_any ******
fork
begin 10 Thread C
#20 $display($time,"\t Thread A"); 12 Thread D
#25 $display($time,"\t Thread B"); 16 Thread E
end 19 Thread F
begin *******After Fork..Join_any*******
#10 $display($time,"\t Thread C"); 20 Thread A
#2 $display($time,"\t Thread D"); 45 Thread B
end
join_any
#4 $display($time,"\t Thread E");
#3 $display($time,"\t Thread F");
$display("********After Fork..Join_any**********");

end
fork… join_none: Example 1
fork-join_none: does not wait for any of
initial begin the parallel processes to complete before
continuing the sequential process.
$display("*********Before Fork..Join_none********");

fork
#15 $display($time,"\t Thread A");
#5 $display($time,"\t Thread B");
*********Before Fork..Join_none********
#10 $display($time,"\t Thread C");
2 Thread D
join_none
5 Thread B
10 Thread C
#2 $display($time,"\t Thread D");
14 Thread E
#12 $display($time,"\t Thread E");
*********After Fork..Join_none*********
15 Thread A
$display("*********After Fork..Join_none*********");
fork… join_none: Example 2
initial begin
$display("*********Before Fork..Join_none********");

fork
begin
$display($time,"\t Thread A");
#15; *********Before Fork..Join_none********
$display($time,"\t Thread B"); *********After Fork..Join_none*********
end 0 Thread A
0 Thread C
begin 15 Thread B
$display($time,"\t Thread C"); 30 Thread D
#30;
$display($time,"\t Thread D");
end
join_none

$display("*********After Fork..Join_none*********");

end
Wait for fork: Example 1
initial begin
$display("**********BEFORE_FORK**********");

fork
begin
$display($time,"\tThread A");
#15; *********BEFORE_FORK**********
$display($time,"\tThread B"); 0 Thread A
end 0 Thread C
15 Thread B
begin *********AFTER_FORK**********
$display($time,"\tThread C");
#30;
$display($time,"\tThread D");
end
join_any

$display("**********AFTER_FORK**********");
$finish;
end
Wait for fork: Example 2
initial begin
$display("**********BEFORE_WAIT_FORK**********");

fork
begin
$display($time,"\tThread A");
#15; ******** BEFORE_WAIT_FORK ******
$display($time,"\tThread B"); 0 Thread A
end 0 Thread C
begin 15 Thread B
$display($time,"\tThread C"); 30 Thread D
#30;
$display($time,"\tThread D"); ******** AFTER_WAIT_FORK ******
end
join_any

wait fork; //waiting for all active fork threads to be finished

$display("**********AFTER_WAIT_FORK**********");
$finish;
end
Disable fork: Example 1
initial begin
$display("**Before Disable fork**"); begin
$display($time,"\tThread C1");
fork #30;
begin $display($time,"\tThread D1");
$display($time,"\tThread A"); end **Before Disable fork**
#15; join_none 0 Thread A
$display($time,"\tThread B"); 0 Thread C
end disable fork;
15 Thread B
begin $display("**After Disable Fork**"); **After Disable Fork**
$display($time,"\tThread C");
#30; $finish;
$display($time,"\tThread D");
end end
join_any

fork
begin
$display($time,"\tThread A1");
#15;
$display($time,"\tThread B1");
end
Disable fork: Example 2
initial begin
$display("**BEFORE_DISABLE_FORK**");

fork
begin : A1
$display($time,"\t Thread A");
#30; **BEFORE_DISABLE_SPECIFIC_THREAD**
$display($time,"\t Thread B"); 0 Thread A
end 0 Thread C
15 Thread D
begin : B1 **AFTER_DISABLE_SPECIFIC_THREAD**
$display($time,"\t Thread C");
#15;
$display($time,"\t Thread D");
end
join_any

disable A1;
$display("**AFTER_DISABLE_FORK**");
$finish;
end
fork… join : Sending Reads and Writes

initial task send_writes(); task write_reg


begin (input [`D_WIDTH-1:0] data);
clk = 1'b0; for (i=0;i<45;i=i+1) begin @ (negedge clk)
wr = 1'b0; rand_time_wr = $urandom % 16; wr = 1'b1;
rd = 1'b0; repeat(rand_time_wr)@(negedge clk); wr_data = data;
drive_reset(); write_reg(($urandom % 16)); @ (negedge clk)
end wr = 0;
fork endtask endtask
send_writes();
send_reads(); task send_reads();
join for (j=0;j<32;j=j+1) begin task read_reg();
rand_time_rd = $urandom % 16; @ (negedge clk)
repeat(3)@(negedge clk); repeat(rand_time_rd)@(negedge clk); rd = 1'b1;
read_reg(); @ (negedge clk)
$finish; end rd = 1'b0;
end endtask endtask
Assertions Example
Specification says that after request signal is asserted, acknowledge signal
must come 1 to 3 cycles later

V2K Assertion

SVA Assertion
Summary : Multithreading

You might also like