Chuong_07

35
6/3/2011 1 Bieân soaïn: Toáng Vaên On Ñaïi hoïc Baùch Khoa TP HCM Baøi 7 Moâ hình haønh vi Bieân soaïn: Toáng Vaên On Ñaïi hoïc Baùch Khoa TP HCM Noäi dung baøi hoïc Caùc thuû tuïc coù caáu truùc always vaø initial trong moâ hình haønh vi. Pheùp gaùn thuû tuïc chaän vaø khoâng chaän. Cô cheá ñieàu khieån ñònh thôøi döïa treân trì hoaõn trong moâ hình haønh vi. Söû duïng regular delay, intra assignment delay vaø zero delay. Cô cheá ñieàu khieån ñònh thôøi döïa treân söï kieän. Söû duïng regular event control, named event control vaø event OR control.

description

Chuong_07

Transcript of Chuong_07

6/3/2011

1

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Baøi 7

Moâ hình haønh vi

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Noäi dung baøi hoïc

Caùc thuû tuïc coù caáu truùc always vaø initialtrong moâ hình haønh vi.

Pheùp gaùn thuû tuïc chaän vaø khoâng chaän.

Cô cheá ñieàu khieån ñònh thôøi döïa treân trì hoaõn trong moâ hình haønh vi. Söû duïng regular delay, intra assignment delay vaø zero delay.

Cô cheá ñieàu khieån ñònh thôøi döïa treân söï kieän. Söû duïng regular event control, named event control vaø event OR control.

6/3/2011

2

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Noäi dung baøi hoïc

Cô cheá ñònh thôøi nhaïy vôùi möùc.

Caùc phaùt bieåu ñieàu kieän söû duïng if, else

Reõ nhaùnh nhieàu ñöôøng söû duïng caùc phaùt bieåu case, casex, casez.

Caùc phaùt bieåu laëp voøng: while, for, repeatvaø forever.

Khoái song song vaø khoái tuaàn töï.

Gaùn teân khoái vaø khoâng cho pheùp khoái ñaõ gaùn teân.

Caùc thí duï söû duïng nhöõng phaùt bieåu moâ hình haønh vi.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

Coù hai phaùt bieåu thuû tuïc coù caáu truùc: always vaø initial. Ñaây laø 2 phaùt bieåu cô baûn nhaát trong vieäc moâ hình haønh vi. Moïi phaùt bieåu haønh vi khaùc chæ coù theå xuaát hieän beân trong hai phaùt bieåu thuû tuïc coù caáu truùc naøy.

Verilog laø ngoân ngöõ laäp trình ñoàng thôøi, nhöõng luoàng hoaït ñoäng vaän haønh song song thay vì tuaàn töï. Moãi phaùt bieåu always vaø initial bieåu dieãn moät luoàng hoaït ñoäng rieâng bieät, ñeàu baét ñaàu ôû thôøi ñieåm moâ phoûng 0. Hai phaùt bieåu treân khoâng theå loàng vaøo nhau.

6/3/2011

3

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

Phaùt bieåu initial

Taát caû caùc phaùt bieåu beân trong phaùt bieåu initial taïo thaønh khoái initial. Khoái initialbaét ñaàu ôû thôøi ñieåm 0, thöïc thi chính xaùc moät laàn cho moät moâ phoûng vaø khoâng thöïc thi laàn nöõa. Neáu coù nhieàu khoái initial, moãi khoái seõ baét ñaàu thöïc thi ñoàng thôøi ôû thôøi ñieåm 0, nhöng vieäc thöïc thi keát thuùc ñoäc laäp vôùi nhau. Nhieàu phaùt bieåu haønh vi coù theå ñöôïc nhoùm (neáu chæ coù 1 phaùt bieåu haønh vi thì khoâng caàn) baèng caùch söû duïng caùc töø khoùa begin vaø end.

Thí duï:

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

module stimulus;

reg x, y, a, b, m;

initial

m = 1’b0; // phaùt bieåu duy nhaát, khoâng nhoùm.

// , thöïc thi ôû thôøi ñieåm 0.

initial

begin

#5 a = 1’b1; // #<delay>, thöïc thi sau 5 dvtg // keå töø 0.

#25 b = 1’b0; // thöïc thi ôû thôøi ñieåm 30.

end

6/3/2011

4

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

initial

begin

#10 x = 1’b0; // thöïc thi sau 10 dvtg keå

// töø 0.

#25 y = 1’b1; // thöïc thi ôû thôøi ñieåm 35.

end

initial

#50 $finish; // thöïc thi sau 50 dvtg keå

// töø 0.

endmodule

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

Phaùt bieåu always

Taát caû phaùt bieåu haønh vi beân trong phaùt bieåu always taïo thaønh khoái always. Phaùt bieåu always baét ñaàu ôû thôøi ñieåm 0 vaø thöïc thi caùc phaùt bieåu trong khoái always lieân tuïc theo caùch laëp voøng. Phaùt bieåu naøy ñöôïc söû duïng ñeå moâ hình khoái hoaït ñoäng ñöôïc laëp laïi lieân tuïc trong maïch soá. Thí duï ñieån hình laø module taïo xung clock. Trong maïch thöïc teá, maïch taïo xung clock tích cöïc töø thôøi ñieåm 0 mieãn laø ñaõ ñöôïc caáp ñieän.

Thí duï:

6/3/2011

5

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

module clock_gen;

reg clock;

initial

clock = 1’b0;

always

#10 clock = ~clock;

initial

#1000 $finish;

endmodule

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thuû tuïc coù caáu truùc

Trong thí duï treân, phaùt bieåu always baét ñaàu ôû thôøi ñieåm 0 vaø thöïc thi phaùt bieåu clock = ~clock moãi 10 dvtg. Löu yù raèng vieäc khôûi ñoäng cho clock phaûi ñöôïc thöïc hieän beân trong moät phaùt bieåu initial rieâng bieät.

Neáu ta khôûi ñoäng clock beân trong khoái always, clock seõ ñöôïc khôûi ñoäng moãi laàn ñi vaøo always. Vieäc moâ phoûng cuõng phaûi ñöôïc döøng beân trong moät phaùt bieåu initial.

Neáu khoâng coù $stop hoaëc $finish ñeå döøng, maïch taïo xung clock seõ hoaït ñoäng maõi maõi.

6/3/2011

6

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Pheùp gaùn thuû tuïc caäp nhaät giaù trò cuûa caùc bieán reg, integer, real vaø time. Giaù trò ñaët treân bieán seõ duy trì khoâng ñoåi cho ñeán khi pheùp gaùn thuû tuïc khaùc caäp nhaät bieán baèng giaù trò khaùc. Ñieàu naøy khoâng gioáng pheùp gaùn tieáp tuïc ôû chöông 6, trong ñoù moät phaùt bieåu gaùn coù theå laøm cho giaù trò cuûa bieåu thöùc veá beân phaûi ñöôïc ñaët tieáp tuïc leân net veá beân traùi.

Cuù phaùp ñôn giaûn nhaát cuûa pheùp gaùn thuû tuïc laø:

<assignment>

<lvalue> = <expression>

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Veá beân traùi cuûa pheùp gaùn thuû tuïc <lvalue> coù theå laø:

- Bieán register reg, integer, real, time hoaëc phaàn töû nhôù.

- Moät löïa choïn bit cuûa caùc bieán naøy.

- Löïa choïn moät phaàn cuûa caùc bieán naøy.

- Noái cuûa nhöõng thaønh phaàn treân.

Veá beân phaûi coù theå laø bieåu thöùc ñöôïc tính giaù trò. Trong moâ hình haønh vi, moïi toaùn töû ôû chöông 6 ñeàu coù theå ñöôïc söû duïng trong bieåu thöùc haønh vi.

6/3/2011

7

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Coù hai loaïi phaùt bieåu gaùn thuû tuïc: chaän vaø khoâng chaän.

Pheùp gaùn thuû tuïc chaän

Caùc phaùt bieåu gaùn chaän ñöôïc thöïc thi theo traät töï ñöôïc chæ ra trong khoái tuaàn töï. Phaùt bieåu chaän seõ khoâng chaän vieäc thöïc thi caùc phaùt bieåu theo sau trong khoái song song.

Toaùn töû = ñöôïc söû duïng ñeå chæ ra pheùp gaùn chaän.

Thí duï:

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

reg x, y, z;

reg [15:0] reg_a, reg_b; integer count;

/* Moïi phaùt bieåu haønh vi phaûi ôû trong khoái initial hoaëc always */

initial

begin

x = 0; y = 1; z = 1; // scalar assignment.

count = 0; // gaùn cho bieán nguyeân.

reg_a = 16’b0; reg_b = reg_a; // khôûi ñoäng

//vectors

6/3/2011

8

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

// Gaùn löïa choïn bit coù trì hoaõn.

#15 reg_a[2] = 1’b1;

// Gaùn keát quaû noái cho löïa choïn moät phaàn cuûa vector.

#10 reg_b[15:13] = {x, y, z};

// Gaùn soá nguyeân

count = count + 1;

end

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Trong thí duï treân, phaùt bieåu y = 1 chæ ñöôïc thöïc thi sau khi x = 0 ñöôïc thöïc thi. Haønh vi trong moät khoái cuï theå laø tuaàn töï beân trong khoái begin-end neáu caùc pheùp gaùn chaän ñöôïc söû duïng, do caùc phaùt bieåu naøy chæ coù theå ñöôïc thöïc thi tuaàn töï.

Phaùt bieåu count = count + 1 ñöôïc thöïc thi sau cuøng.

Thôøi gian moâ phoûng ôû ñoù caùc phaùt bieåu ñöôïc thöïc thi nhö sau:

6/3/2011

9

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

- Moïi phaùt bieåu töø x = 0 ñeán reg_b = reg_a ñöôïc thöïc thi ôû thôøi ñieåm 0.

- Phaùt bieåu reg_a[2] = 1: thôøi ñieåm 15.

- Phaùt bieåu reg_b[15:13] = {x, y, z}: thôøi ñieåm 25.

- Phaùt bieåu count = count + 1: thôøi ñieåm 25 (do coù hai delay ôû hai phaùt bieåu tröôùc ñoù).

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Pheùp gaùn thuû tuïc khoâng chaän

Pheùp gaùn khoâng chaän cho pheùp ñònh thôøi caùc pheùp gaùn maø khoâng chaän vieäc thöïc thi caùc phaùt bieåu theo sau trong khoái tuaàn töï. Toaùn töû <= ñöôïc söû duïng ñeå chæ ra pheùp gaùn khoâng chaän. Thí duï sau seõ minh hoïa haønh vi cuûa pheùp gaùn khoâng chaän vaø khaùc bieät so vôùi pheùp gaùn chaän. Ta seõ bieán ñoåi moät vaøi pheùp gaùn chaän ôû thí duï tröôùc thaønh pheùp gaùn khoâng chaän vaø quan saùt haønh vi.

6/3/2011

10

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

reg x, y, z;

reg [15:0] reg_a, reg_b; integer count;

/* Moïi phaùt bieåu haønh vi phaûi ôû trong khoái initial hoaëc always */

initial

begin

x = 0; y = 1; z = 1; // scalar assignment.

count = 0; // gaùn cho bieán nguyeân.

reg_a = 16’b0; reg_b = reg_a; // khôûi ñoäng

//vectors

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

// Gaùn löïa choïn bit coù trì hoaõn.

reg_a[2] <= #15 1’b1;

// Gaùn keát quaû noái cho löïa choïn moät phaàn cuûa vector.

reg_b[15:13] <= #10 {x, y, z};

// Gaùn soá nguyeân

count <= count + 1;

end

6/3/2011

11

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Trong thí duï treân, caùc phaùt bieåu töø x = 0 ñeán reg_a = reg_b ñöôïc thöïc thi tuaàn töï taïi thôøi ñieåm t = 0. Keá ñeán 3 pheùp gaùn “khoâng chaän” ñöôïc xöû lyù ôû cuøng thôøi ñieåm moâ phoûng:

- reg_a[2] = 1 ñöôïc thöïc thi ôû 15.

- reg_b[15:13] = {x, y, z} ñöôïc thöïc thi ôû 10.

- Count = count + 1 ñöôïc thöïc thi ôû 0.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Nhö vaäy, trình moâ phoûng saép xeáp thöïc thi phaùt bieåu gaùn khoâng chaän vaø tieáp tuïc ñeán phaùt bieåu keá trong khoái maø khoâng chôø phaùt bieåu khoâng chaän thöïc thi hoaøn taát.

Cuï theå, caùc phaùt bieåu gaùn khoâng chaän ñöôïc thöïc thi sau cuøng trong khoaûng thôøi gian maø chuùng ñöôïc saép xeáp, sau khi moïi pheùp gaùn chaän trong khoaûng thôøi gian ñoù ñöôïc thöïc thi.

6/3/2011

12

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Ta ñaõ moâ taû haønh vi cuûa caùc pheùp gaùn khoâng chaän, ñieàu quan troïng laø taïi sao pheùp gaùn naøy ñöôïc söû duïng trong thieát keá maïch soá. Caùc pheùp gaùn khoâng chaän ñöôïc söû duïng laøm phöông phaùp moâ hình vieäc truyeàn nhieàu döõ lieäu ñoàng thôøi, xaûy ra sau moät söï kieän toång quaùt.

Ta haõy khaûo saùt thí duï truyeàn 3 döõ lieäu ñoàng thôøi xaûy ra ôû caïnh döông cuûa xung clock.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

always @(posedge clock)

begin

reg1 <= #1 in1;

reg2 <= @(negedge clock) in2 ^ in3;

reg3 <= #1 reg1; // giaù trò cuõ cuûa reg1.

end

ÔÛ caïnh döông cuûa xung clock, trình töï sau ñaây xaûy ra ñoái vôùi caùc pheùp gaùn khoâng chaän:

6/3/2011

13

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Thao taùc “ñoïc” ñöôïc thöïc hieän treân moãi bieán cuûa veá beân phaûi (in1, in2, in3 vaø reg1) ôû caïnh döông cuûa clock. Caùc bieåu thöùc veá beân phaûi ñöôïc tính toaùn vaø caùc keát quaû ñöôïc löu beân trong trình moâ phoûng (caùc bieán taïm).

Caùc thao taùc “ghi” cho caùc bieán veá beân traùi ñöôïc saép xeáp ñeå ñöôïc thöïc hieän ôû thôøi ñieåm ñöôïc chæ ra bôûi trì hoaõn noäi trong moãi pheùp gaùn, nghóa laø saép xeáp “ghi” cho reg1 sau 1 dvtg, reg2 ôû caïnh aâm keá cuûa xung clock vaø reg3 sau 1 dvtg.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

Caùc thao taùc “ghi” ñöôïc thöïc thi ôû caùc khoaûng thôøi gian ñöôïc saép xeáp. Thöù töï trong ñoù caùc thao taùc ghi ñöôïc thöïc thi khoâng quan troïng do caùc giaù trò cuûa caùc bieåu thöùc veá beân phaûi ñaõ ñöôïc löu seõ ñöôïc söû duïng ñeå gaùn cho caùc giaù trò veá beân traùi. Thí duï, löu yù raèng reg3 ñöôïc gaùn giaù trò cuõ cuûa reg1 maø giaù trò naøy ñaõ ñöôïc löu sau thao taùc “ñoïc”, ngay caû neáu thao taùc “ghi” ñaõ ghi giaù trò môùi cho reg1 tröôùc khi thao taùc “ghi” cho reg3 ñöôïc thöïc thi. Nhö vaäy giaù trò sau cuøng cuûa reg1, reg2 vaø reg3 khoâng phuï thuoäc vaøo traät töï maø caùc pheùp gaùn ñöôïc xöû lyù.

6/3/2011

14

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

/* Hai khoái always ñoàng thôøi vôùi caùc pheùp gaùn chaän, hoaùn ñoåi noäi dung*/

always @(posedge clock)

a = b;

always @(posedge clock)

b = a;

Coù ñieàu kieän tranh ñua giöõa hai pheùp gaùn chaän neân giaù trò cuûa a vaø b khoâng ñöôïc hoaùn ñoåi maø caû hai register naøy seõ coù cuøng giaù trò hoaëc cuûa a hoaëc cuûa b tuøy thuoäc vaøo söï thöïc hieän cuûa trình moâ phoûng.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

/* Hai khoái always ñoàng thôøi vôùi caùc pheùp gaùn khoâng chaän, hoaùn ñoåi noäi dung*/

always @(posedge clock)

a <= b;

always @(posedge clock)

b <= a;

Vieäc xöû lyù ñöôïc thöïc hieän baèng caùch söû duïng bieán taïm nhö sau (töï ñoäng):

6/3/2011

15

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Pheùp gaùn thuû tuïc

always @(posedge clock)

begin

// thao taùc “ñoïc”

temp_a = a;

temp_b = b;

// thao taùc “ghi”

a = temp_b;

b = temp_a;

end

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

Nhieàu caáu truùc ñieàu khieån ñònh thôøi trong moâ hình haønh vi ñöôïc hoã trôï bôûi Verilog. Neáu khoâng coù caùc phaùt bieåu ñieàu khieån ñònh thôøi, thôøi gian moâ phoûng seõ khoâng tieán leân ñöôïc.

Caùc ñieàu khieån ñònh thôøi cung caáp phöông tieän chæ ra thôøi gian moâ phoûng ôû ñoù caùc phaùt bieåu gaùn thuû tuïc seõ ñöôïc thöïc thi.

Coù 3 phöông phaùp ñieàu khieån ñònh thôøi: döïa treân trì hoaõn (delay-based), döïa treân söï kieän (event-based) vaø nhaïy vôùi möùc logic (level-sensitive).

6/3/2011

16

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

1. Ñieàu khieån ñònh thôøi döïa treân trì hoaõn.

Ñieàu khieån trì hoaõn bình thöôøng

parameter latency = 20; parameter delta = 2;

initial // caùc phaùt bieåu ñöôïc thöïc thi tuaàn töï.

reg x, y, z, p, q;

x = 0; #10 y = 1; #latency z = 0;

#(latency + delta) p = 1;

#y x = x + 1;

#(4:5:6) q = 0;

end

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

Ñieàu khieån trì hoaõn gaùn noäi

reg x, y, z;

// intra assignment delay

initial

begin

x = 0; z = 0; y = #5 x + y; /* laáy giaù trò x vaø y thôøi ñieåm 0, ñaùnh giaù x + y, chôø 5 dvtg ñeå gaùn giaù trò cho y*/

end

6/3/2011

17

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

// Phöông phaùp töông ñöông.

initial

begin

x = 0; z = 0; temp_xz = x + z;

#5 y = temp_xz; /* laáy giaù trò cuûa x + z ôû thôøi ñieåm hieän haønh vaø löu trong bieán taïm naøo ñoù. Ngay caû khi x vaø z thay ñoåi trong khaûng giöõa 0 vaø 5, giaù trò ñöôïc gaùn cho y ôû thôøi ñieåm 5 khoâng bò aûnh höôûng*/

end

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

Ñieàu khieån trì hoaõn zero

initial

begin

x = 0; y = 0;

end

initial

#0 x = 1; #0 y = 1;

end

6/3/2011

18

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

2. Ñieàu khieån ñònh thôøi döïa treân söï kieän

Ñieàu khieån söï kieän bình thöôøng

/* q = d ñöôïc thöïc thi moãi khi clock thay ñoåi giaù trò*/

@(clock) q = d;

/* q = d ñöôïc thöïc thi moãi khi clock chuyeån traïng thaùi döông: (0, x, z) sang 1, 0 sang x hoaëc z*/

@(posedge clock) q = d;

// 1 sang (0, x, z), x sang 0, z sang 0

@(negedge clock) q = d;

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

Ñieàu khieån söï kieän ñaõ gaùn teân

event received_data;

/* Ñònh nghóa söï kieän coù teân laø received_data*/

always @(posedge clock)

begin

if (last_data_packet) -> received_data

/* neáu ñaây laø goùi döõ lieäu sau cuøng, kích khôûi söï kieän received_data*/

end

6/3/2011

19

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

// Chôø söï kieän received_data,

// khi söï kieän ñöôïc kích khôûi, löu taát caû 4

// goùi cuûa received_data vaøo vuøng ñeäm

// döõ lieäu, söû duïng toaùn töû noái.

always @(received_data)

data_buf = {data_pkt[0], data_pkt[1], data_pkt[2], data_pkt[3]};

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

Ñieàu khieån OR söï kieän

// Maïch choát coù reset khoâng ñoàng boä.

always @(reset or clock or d)

// Chôø söï thay ñoåi cuûa reset hoaëc clock hoaëc d

begin

if (reset) // neáu reset = 1, q = 0.

q = 1’b0;

else if(clock) // neáu clock = 1, q = d.

q = d;

end

6/3/2011

20

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Ñieàu khieån ñònh thôøi

3. Ñieàu khieån ñònh thôøi nhaïy möùc logic

always

wait (count_enable)

#20 count = count + 1;

Giaù trò cuûa count_enable ñöôïc giaùm saùt lieân tuïc, neáu count_enable = 0, phaùt bieåu khoâng ñöôïc thöïc thi.

Neáu count_enable = 1, phaùt bieåu ñöôïc thöïc thi sau 20 dvtg.

Neáu count_enable vaãn giöõ logic 1, count seõ taêng moãi 20 dvtg.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu ñieàu kieän if, else

Daïng 1: khoâng coù else

if (<expression>) true_statement;

Daïng 2: moät else

if (<expression>) true_statement;

else false_statement;

Daïng 3: if-else-if loàng nhau.

if (<expression1>) true_statement1;

else if (<expression2>) true_statement2;

else if (<expression3>) true_statement3;

else default_statement;

6/3/2011

21

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu ñieàu kieän if, else

Neáu <expression> ñuùng (baèng 1 hoaëc moät giaù trò khaùc 0), true_statement ñöôïc thöïc thi. Neáu sai (baèng 0 hoaëc x, z), false_statement ñöôïc thöïc thi. Expression coù theå chöùa baát kyø toaùn töû naøo ñaõ ñeà caäp ôû chöông 6.

Phaùt bieåu coù theå laø ñôn hoaëc moät nhoùm phaùt bieåu ñaët trong moät khoái. Khoái ñieån hình söû duïng töø khoùa begin vaø end.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu ñieàu kieän if, else

if (!lock) buffer = data;

if (enable) out = in; Thí duï khaùc:

if (alu_control == 0)

y = x + z;

else if (alu_control == 1)

y = x – z;

else if (alu_control == 2)

y = x * z;

else

$display(“Invalid ALU control signal”);

6/3/2011

22

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

Töø khoùa: case, endcase vaø default.

case (expression)

alternative1: statement1;

alternative2: statement2;

alternative3: statement3;

. . .

default: default_statement; // phaùt

// bieåu maëc ñònh

endcase

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

Moãi phaùt bieåu statement1, statement2, . . . , default_statement coù theå laø phaùt bieåu ñôn hoaëc moät khoái nhieàu phaùt bieåu. Khoái nhieàu phaùt bieåu coù theå ñöôïc nhoùm baèng töø khoùa begin vaø end.

Bieåu thöùc ñöôïc so saùnh vôùi caùc alternativetheo thöù töï maø chuùng ñöôïc vieát. Alternativenaøo töông thích, phaùt bieåu hoaëc khoái töông öùng ñöôïc thöïc thi.

Neáu khoâng coù alternative naøo töông thích, phaùt bieåu maëc ñònh (default_statement) ñöôïc thöïc thi. Phaùt bieåu maëc ñònh laø tuøy choïn.

6/3/2011

23

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

Vieäc ñaët nhieàu phaùt bieåu tuøy choïn trong moät phaùt bieåu case seõ khoâng ñöôïc pheùp. Caùc phaùt bieåu case coù theå loàng vaøo nhau.

reg [1:0] alu_control; . . . . .

case (alu_control)

2’d0 : y = x + z;

2’d1 : y = x – z;

2’d2 : y = x * z;

default : $display(“Invalid ALU control signal”);

endcase

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

module mux4_to_1(out, i0, i1, i2, i3, s1, s0);

output out; input i0, i1, i2, i3, s1, s0;

reg out;

always @(s1 or s0 or i0 or i1 or i2 or i3)

case ({s1, s0})

2’d0 : out = i0; 2’d1 : out = i1;

2’d2 : out = i0; 2’d3 : out = i3;

default : $display(“Invalid controlsignal”);

endcase

endmodule

6/3/2011

24

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

Phaùt bieåu case so saùnh caùc giaù trò 0, 1, x vaø z trong bieåu thöùc vaø caùc alternative theo töøng bit. Neáu chuùng coù ñoä roäng bit khoâng baèng nhau, bit 0 seõ ñöôïc ñieàn vaøo ñeå töông thích vôùi ñoä roäng bit lôùn nhaát.

Trong thí duï sau, ta seõ ñònh nghóa DEMUX 1 4 coù caùc ngoõ ra ñöôïc chæ roõ hoaøn toaøn, nghóa laø ngay caû vôùi caùc giaù trò x vaø z cuûa caùc tín hieäu ñieàu khieån.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

module demux1_to_4(out0, out1, out2, out3, in, s1, s0);

output out0, out1, out2, out3;

reg out0, out1, out2, out3;

input in; input s1, s0;

always @(s1 or s0 or in)

case ({s1, s0})

2’b00 : begin out0 = in; out1 = 1’bz; out2 = 1’bz; out3 = 1’bz; end

2’b01 : begin out0 = 1’bz; out1 = in; out2 = 1’bz; out3 = 1’bz; end

6/3/2011

25

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

2’b10 : begin out0 = 1’bz; out1 = 1’bz; out2 = in; out3 = 1’bz; end

2’b11 : begin out0 = 1’bz; out1 = 1’bz; out2 = 1’bz; out3 = in; end

2’bx0, 2’bx1, 2’bzx, 2’bxx, 2’b0x, 2’b1x, 2’bzx :

begin out0 = 1’bx; out1 = 1’bx; out2 = 1’bx; out3 = 1’bx; end

2’bz0, 2’bz1, 2’bzz, 2’b0z, 2’b1z :

begin out0 = 1’bz; out1 = 1’bz; out2 = 1’bz; out3 = 1’bz; end

default : $display(“Unspecified control signal”);

endcase

endmodule

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

Coù hai bieán theå cuûa phaùt bieåu case, ñoù laø casex vaø casez.

- casez: xöû lyù moïi giaù trò z trong caùc alternative vaø bieåu thöùc nhö laø giaù trò tuøy ñònh. Moïi vò trí bit coù z cuõng coù theå ñöôïc bieåu dieãn baèng ? ôû vò trí ñoù.

- casex: xöû lyù moïi giaù trò x vaø z nhö laø giaù trò tuøy ñònh.

6/3/2011

26

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

Vieäc söû duïng casex vaø casez cho pheùp ta chæ so saùnh caùc bit khoâng phaûi laø x vaø z trong bieåu thöùc vaø trong caùc alternative. Thí duï sau ñaây minh hoïa vieäc giaûi maõ caùc bit traïng thaùi trong moät maùy traïng thaùi höõu haïn söû duïng phaùt bieåu casex, chæ coù moät bit ñöôïc xem xeùt ñeå quyeát ñònh traïng thaùi keá coøn caùc bit khaùc boû qua.

Vieäc söû duïng phaùt bieåu casez cuõng töông töï.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Phaùt bieåu reõ nhaùnh case

reg [3:0] encoding;

integer state;

case (encoding)

4’b1xxx : next_state = 3;

4’bx1xx : next_state = 2;

4’bxx1x : next_state = 1;

4’bxxx1 : next_state = 0;

default : next_state = 0;

endcase

Neáu encoding = 4’b10xz, next_state = 3 ñöôïc thöïc thi.

6/3/2011

27

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp while

Töø khoùa while. Voøng laëp while thöïc thi cho ñeán khi while_expression trôû thaønh sai. Neáu ta ñi vaøo voøng laëp khi while_expression laø sai, voøng laëp seõ khoâng ñöôïc thöïc thi.

Moãi bieåu thöùc coù theå chöùa caùc toaùn töû ôû chöông 6. Bieåu thöùc logic baát kyø coù theå ñöôïc chæ ra baèng caùc toaùn töû naøy.

Neáu nhieàu phaùt bieåu ñöôïc thöïc thi trong voøng laëp, chuùng phaûi ñöôïc nhoùm baèng söû duïng begin vaø end (chaúng haïn).

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp while

integer count;

initial

begin

count = 0;

while (count < 128)

begin

$display(“count = %d”, count);

count = count + 1;

end

end

6/3/2011

28

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp for

Töø khoùa for. Voøng laëp for chöùa 3 phaàn:

- Ñieàu kieän khôûi ñoäng.

- Kieåm tra xem coù phaûi ñieàu kieän keát thuùc laø ñuùng.

- Pheùp gaùn thuû tuïc ñeå thay ñoåi giaù trò cuûa bieán ñieàu khieån.

integer count;

initial

for (count = 0; count < 128; count = count + 1)

$display(“Count = %d”, count);

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp for

// Khôûi ñoäng caùc phaàn töû cuûa daûi

`define MAX_STATES 32

integer state [0: `MAX_STATES – 1)]

integer i;

initial

begin

for (i = 0; i < 32; i = i + 2) state[i] = 0;

for (i = 1; i < 32; i = i + 2) state[i] = 1;

end

6/3/2011

29

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp repeat

Töø khoùa repeat. Caáu truùc repeat thöïc thi voøng laëp moät soá laàn coá ñònh.

Caáu truùc repeat khoâng theå söû duïng ñeå laëp voøng treân moät bieåu thöùc logic toång quaùt.

Caáu truùc repeat phaûi chöùa moät soá, soá naøy coù theå laø haèng, giaù trò cuûa bieán hoaëc tín hieäu. Neáu soá laø giaù trò cuûa moät bieán hoaëc tín hieäu, soá naøy ñöôïc ñaùnh giaù chæ khi voøng laëp baét ñaàu, khoâng phaûi trong thôøi gian thöïc thi voøng laëp.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp repeat

Thí duï 1:

integer count;

initial

begin

count = 0;

repeat(128)

begin

$display(“Count = %d”, count);

count = count + 1;

end

end

6/3/2011

30

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp repeat

Thí duï 2:

module data_buffer(data_start, data, clock);

parameter cycles = 8;

input data_start;

input [15:0] data;

input clock;

reg [15:0] buffer [0:7];

integer i;

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp repeat

always @(posedge clock)

begin

if (data_start)

begin

i = 0;

repeat(cycles)

begin

@(posedge clock) buffer[i] = data;

i = i + 1;

end

end

end

endmodule

6/3/2011

31

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp forever

Voøng laëp naøy khoâng chöùa baát kyø bieåu thöùc naøo vaø thöïc thi maõi maõi cho ñeán khi gaëp $finish. Ta coù theå thoaùt khoûi voøng laëp naøy baèng caùch söû duïng phaùt bieåu disable.

Voøng laëp naøy thöôøng ñöôïc söû duïng keát hôïp vôùi caùc caáu truùc ñieàu khieån ñònh thôøi. Neáu caùc caáu truùc ñieàu khieån ñònh thôøi khoâng ñöôïc söû duïng, trình moâ phoûng Verilog seõ thöïc thi phaùt bieåu naøy voâ taän nhöng thôøi gian moâ phoûng seõ khoâng tieán leân vaø phaàn coøn laïi cuûa thieát keá seõ khoâng bao giôø ñöôïc thöïc thi.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Voøng laëp forever

// Taïo xung clock.

// Söû duïng forever thay cho khoái always.

reg clock;

initial

begin

clock = 1’b0;

forever #10 clock = ~clock;

end

6/3/2011

32

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

1. Khoái tuaàn töï: töø khoùa begin vaø end.

- Caùc phaùt bieåu trong khoái tuaàn töï ñöôïc xöû lyù theo thöù töï maø chuùng ñöôïc chæ ra. Phaùt bieåu chæ ñöôïc thöïc thi sau khi phaùt bieåu tröôùc ñoù hoaøn taát vieäc thöïc thi (ngoaïi tröø pheùp gaùn khoâng chaän coù ñieàu khieån ñònh thôøi gaùn noäi).

- Neáu ñieàu khieån trì hoaõn vaø ñieàu khieån söï kieän ñöôïc chæ ra, ñieàu naøy lieân quan ñeán thôøi ñieåm moâ phoûng luùc phaùt bieåu tröôùc ñoù ñaõ hoaøn taát vieäc thöïc thi.

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

2. Khoái song song: töø khoùa fork vaø join.

- Caùc phaùt bieåu trong khoái song song ñöôïc thöïc thi ñoàng thôøi.

- Thöù töï cuûa caùc phaùt bieåu ñöôïc ñieàu khieån bôûi ñieàu khieån trì hoaõn hoaëc söï kieän gaùn cho töøng phaùt bieåu.

- Neáu ñieàu khieån trì hoaõn hoaëc söï kieän ñöôïc chæ ra, ñieàu naøy lieân quan ñeán thôøi ñieåm maø khoái ñöôïc thöïc thi.

6/3/2011

33

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

reg x, y;

reg [1:0] z, w;

initial

fork

x = 1’b0;

#5 y = 1’b1;

#10 z = {x, y};

#20 w = {y, x};

join

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

3. Caùc tính chaát cuûa khoái.

- Khoái ñöôïc gaùn teân: caùc khoái coù theå ñöôïc gaùn teân.

- Bieán cuïc boä coù theå ñöôïc khi baùo ñoái vôùi khoái ñöôïc gaùn teân.

- Khoái ñöôïc gaùn teân laø 1 phaàn cuûa heä thoáng thöù baäc thieát keá. Caùc bieán trong khoái ñöôïc gaùn teân coù theå ñöôïc truy caäp baèng caùch söû duïng tham chieáu teân theo heä thoáng thöù baäc.

- Caùc khoái ñöôïc gaùn teân coù theå bò voâ hieäu hoùa, nghóa laø vieäc thöïc thi chuùng coù theå bò döøng.

6/3/2011

34

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

module top;

initial

begin: block1

integer i;

. . . // top.block1.i

end

initial

fork

reg i;

… // top.block2.i

join

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

reg [15:0] flag;

integer i;

initial

begin

flag = 16’b0010_0000_0000_0000;

i = 0;

begin block1

while (i < 16)

begin

if (flag[i])

6/3/2011

35

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Khoái tuaàn töï vaø song song

begin

$display(“ . . . .”, i);

disable block1;

end

i = i + 1;

end

end

end

Bieân soaïn: Toáng Vaên On – Ñaïi hoïc Baùch Khoa TP HCM

Thí duï

// 4-bit binary counter.

module counter(Q, clock, clear);

output [3:0] Q;

input clock, clear;

reg [3:0] Q;

always @(posedge clear or negedge clock)

begin

if (clear)

Q = 4’d0;

else

Q = (Q + 1) % 16;

end

endmodule