Baøi 3: Khaùi nieäm cô baûn
Thieát keá soá vôùi Verilog HDL
Ñoái töôïng nghieân cöùu - Caùc qui öôùc töø vöïng cuûa toaùn töû, chuù thích, khoaûng traéng, soá, chuoãi vaø ñònh danh. - Ñònh nghóa taäp giaù trò logic vaø caùc kieåu döõ lieäu chaúng haïn nhö net, register, vector, soá, thôøi gian moâ phoûng, daûi, parameter, phaàn töû nhôù vaø chuoãi. - Nhaän daïng vaøi task heä thoáng: hieån thò, giaùm saùt thoâng tin vaø döøng, keát thuùc moâ phoûng.
Qui öôùc töø vöïng - Verilog chöùa doøng caùc token. Token coù theå laø chuù thích, ñònh ranh (delimiter), soá, chuoãi, ñònh danh vaø töø khoùa. - Khoaûng traéng. Blank space (\b), tabs (\t) vaø doøng môùi (\n). Chuùng ñöôïc boû qua bôûi Verilog tröø khi duøng ñeå taùch bieät caùc token. Khoaûng traéng khoâng ñöôïc boû qua trong chuoãi.
Qui öôùc töø vöïng (tieáp theo) - Chuù thích. a = b && c; // Ñaây laø moät doøng chuù thích. /* Ñaây laø nhieàu doøng chuù thích */ /* Ñaây laø /* chuù thích */ khoâng hôïp leä */
Qui öôùc töø vöïng (tieáp theo) - Toaùn töû. Coù 3 loaïi toaùn töû: unary, binary vaø ternary. a = ~b; // toaùn töû ñôn nguyeân. a = b && c; // toaùn töû nhò nguyeân. a = b ? c : d; // toaùn töû tam nguyeân.
Qui öôùc töø vöïng (tieáp theo) - Soá. Soá coù kích thöôùc <size>’ <size>: daïng thaäp phaân chæ ra soá bit cuûa con soá. : ‘d hoaëc ‘D, ‘h hoaëc H, ‘b hoaëc ‘B vaø ‘o hoaëc ‘O. : ñöôïc chæ ra döôùi daïng caùc digit lieân tieáp (0, 1, . . 9, a, b,
Qui öôùc töø vöïng (tieáp theo)
4’b1111 // ñaây laø soá nhò phaân 4bit. 12’habc // ñaây laø soá hex 12-bit. 16’d255 // ñaây laø soá thaäp phaân 16-bit.
Qui öôùc töø vöïng (tieáp theo) Soá khoâng ñònh kích thöôùc Soá khoâng coù maëc ñònh laø soá thaäp phaân. Soá khoâng coù <size> coù soá bit maëc ñònh tuøy theo trình moâ phoûng (phaûi toái thieåu laø 32-bit).
Qui öôùc töø vöïng (tieáp theo)
23456 // ñaây laø soá thaäp phaân // 32-bit theo maëc ñònh. ‘hc3 // ñaây laø soá hex 32-bit theo maëc ñònh ‘o21 // ñaây laø soá baùt phaân // 32-bit theo maëc ñònh.
Qui öôùc töø vöïng (tieáp theo) Giaù trò x vaø z x: giaù trò chöa bieát. z: giaù trò toång trôû cao. 12’h13x 6’hx 32’bz
Qui öôùc töø vöïng (tieáp theo) x vaø z thieát laäp 4-bit ñoái vôùi soá hex, 3-bit ñoái vôùi soá baùt phaân vaø 1-bit ñoái vôùi soá nhò phaân. Neáu bit coù yù nghóa lôùn nhaát cuûa con soá laø 0, x hoaëc z, con soá ñöôïc töï ñoäng môû roäng ñeå laøm ñaày caùc bit coù yù nghóa lôùn nhaát baèng 0, x hoaëc z theo thöù töï ta deã daøng gaùn x vaø z cho toaøn boä moät vector. Neáu
Qui öôùc töø vöïng (tieáp theo) Soá aâm -8’d3 // soá -3 8-bit bieåu dieãn ôû daïng buø-2. 4’d-2 // moâ taû khoâng hôïp leä. Kyù töï gaïch döôùi Trong con soá ñöôïc duøng ñeå ñoïc cho deã.
Qui öôùc töø vöïng (tieáp theo) Kyù töï ? ? Thay theá cho z trong ngöõ caûnh con soá. ? Ñöôïc söû duïng cho deã ñoïc trong caùc phaùt bieåu casex vaø casez (chöông 7), trong ñoù giaù trò toång trôû cao laø ñieàu kieän tuøy ñònh. ? Coù nghóa khaùc trong ngöõ caûnh caùc cell maãu cô baûn do ngöôøi söû duïng ñònh nghóa.
Qui öôùc töø vöïng (tieáp theo) - Chuoãi Chuoãi bao goàm caùc kyù töï giöõa hai ngoaëc keùp, chæ ôû treân moät doøng (khoâng ñöôïc coù kyù töï xuoáng haøng), ñöôïc xöû lyù nhö chuoãi kyù töï ASCII 1-byte. “Hello Verilog World” “a / b”
Qui öôùc töø vöïng (tieáp theo) - Ñònh danh vaø töø khoùa. Töø khoùa laø ñònh danh ñaëc bieät daønh rieâng ñeå ñònh nghóa caùc caáu truùc ngoân ngöõ. Ñònh danh laø teân gaùn cho ñoái töôïng ñeå ñöôïc tham chieáu trong thieát keá. Ñònh danh coù theå bao goàm caû caùc kyù töï soá vaø daáu gaïch döôùi, daáu $ (chæ ñoái vôùi task heä thoáng) nhöng phaûi baét ñaàu baèng kyù töï chöõ
Qui öôùc töø vöïng (tieáp theo) - Ñònh danh escaped. Baét ñaàu baèng \ vaø keát thuùc baèng khoaûng traéng. \ vaø khoaûng traéng khoâng ñöôïc xem laø boä phaän cuûa ñònh danh. \a+b-c \**my_name**
Kieåu döõ lieäu - Taäp giaù trò. Verilog hoã trôï 4 giaù trò vaø 8 ñoä maïnh ñeå moâ hình chöùc naêng cuûa phaàn cöùng thöïc teá, giaûi quyeát vaán ñeà xung ñoät giöõa nhöõng kích thích (drivers) coù ñoä maïnh (strength) khaùc nhau. 4 giaù trò laø: 0 logic 0, ñieàu kieän sai. 1 logic 1, ñieàu kieän ñuùng. x giaù trò chöùa bieát.
Kieåu döõ lieäu (tieáp theo) Caùc giaù trò 0, 1 coù 8 ñoä maïnh laø: Ñoä maïnh Loaïi Thöù töï supply driving Maïnh nhaát strong driving pull driving large storage weak driving medium storage small storage
Kieåu döõ lieäu (tieáp theo) Neáu hai tín hieäu coù ñoä maïnh khaùc nhau ñöôïc kích treân moät ñöôøng daây, tín hieäu maïnh hôn seõ chieám öu theá. Thí duï, hai tín hieäu coù ñoä maïnh strong1 vaø weak0 ñang tranh ñua, keát quaû seõ laø strong1. Neáu hai tín hieäu coù ñoä maïnh baèng nhau ñöôïc kích treân moät ñöôøng daây, keát quaû seõ laø chöa bieát. Thí duï, hai tín hieäu coù ñoä maïnh strong1 vaø
Kieåu döõ lieäu (tieáp theo) - Net. Net bieåu dieãn keát noái giöõa nhöõng phaàn töû phaàn cöùng. Gioáng nhö trong maïch thöïc teá, caùc net coù giaù trò ñöôïc kích lieân tuïc treân chuùng bôûi ngoõ ra cuûa caùc linh kieän maø chuùng ñöôïc keát noái ñeán. Laáy thí duï coång AND hai ngoõ vaøo, net a seõ lieân tuïc thöøa nhaän giaù trò ñöôïc tính ôû ngoõ
Kieåu döõ lieäu (tieáp theo) Caùc net ñöôïc khai baùo baèng töø khoùa wire. Caùc net laø nhöõng giaù trò 1-bit maëc ñònh tröø khi chuùng ñöôïc khai baùo roõ raøng laø caùc vector. Thuaät ngöõ wire vaø net thöôøng ñöôïc söû duïng thay theá cho nhau. Giaù trò maëc ñònh cuûa net laø z (ngoaïi tröø net trireg laø x). Net laáy giaù trò ngoõ ra cuûa caùc yeáu toá kích, net khoâng coù yeáu
Kieåu döõ lieäu (tieáp theo) wire a; // khai baùo net a, thí duï coång AND wire b, c; // -ntwire d = 1’b0; // net d coá ñònh ôû logic 0 // luùc khai baùo. Löu yù raèng net khoâng phaûi laø töø khoùa maø bieåu dieãn moät lôùp kieåu döõ lieäu chaúng haïn nhö wire, wand, wor, triand, trior, trireg, v.v… Khai baùo wire ñöôïc söû
Kieåu döõ lieäu (tieáp theo) - Register. Register bieåu dieãn phaàn töû löu giöõ döõ lieäu. Caùc register duy trì giaù trò cho ñeán khi giaù trò khaùc ñöôïc ñaët leân chuùng. Trong Verilog, thuaät ngöõ register chæ ñôn thuaàn laø bieán coù theå duy trì giaù trò. Khoâng gioáng nhö net, register khoâng caàn yeáu toá kích. Giaù trò cuûa register coù theå ñöôïc thay ñoåi baát kyø luùc naøo
Kieåu döõ lieäu (tieáp theo) Kieåu döõ lieäu register thöôøng ñöôïc khai baùo baèng töø khoùa reg. Giaù trò maëc ñònh cuûa kieåu döõ lieäu reg laø x. Thí duï: reg reset; begin reset = 1’b1; // tích cöïc logic 1. #100 reset = 1’b0; end
Kieåu döõ lieäu (tieáp theo) - Vector. Net hoaëc caùc kieåu döõ lieäu reg coù theå ñöôïc khai baùo döôùi daïng caùc vector (ñoä roäng nhieàu bit). Neáu ñoä roäng bit khoâng ñöôïc chæ roõ, maëc ñònh laø 1-bit. Thí duï: wire a; wire [7:0] bus; wire [31:0] busA, busB, busC; reg clock;
Kieåu döõ lieäu (tieáp theo) Vector coù theå ñöôïc kích caïnh laø [high#:low#] hoaëc [low#:high#] nhöng soá beân traùi luoân luoân laø bit coù yù nghóa lôùn nhaát cuûa vector. Ta coù theå laáy ra caùc bit hoaëc caùc phaàn cuûa vector. Td: busA[7] bus[2:0] // nhöng bus[0:2] laø khoâng hôïp leä
Kieåu döõ lieäu (tieáp theo) - Kieåu nguyeân. Laø kieåu döõ lieäu register muïc ñích toång quaùt ñöôïc söû duïng ñeå quaûn lyù soá löôïng. Töø khoùa: integer. Kieåu reg löu giaù trò döôùi daïng soá khoâng daáu. Kieåu integer löu giaù trò döôùi daïng soá coù daáu. Thí duï: integer counter; initial
Kieåu döõ lieäu (tieáp theo) - Kieåu thöïc. Töø khoùa: real. Haèng soá thöïc vaø kieåu döõ lieäu register thöïc. Thí duï: real delta; initial begin delta = 4e10; delta = 2.13; end
Kieåu döõ lieäu (tieáp theo) Khi moät giaù trò thöïc ñöôïc gaùn cho moät kieåu nguyeân, soá thöïc ñöôïc laøm troøn ñeán soá nguyeân gaàn nhaát. Thí duï: integer i; initial i = delta; // i = 2.
Kieåu döõ lieäu (tieáp theo) - Time. Moâ phoûng Verilog ñöôïc thöïc hieän theo thôøi gian moâ phoûng. Kieåu döõ lieäu register time ñöôïc duøng trong Verilog ñeå löu giöõ thôøi gian moâ phoûng. Bieán thôøi gian ñöôïc khai baùo baèng töø khoùa time. Haøm heä thoáng $time ñöôïc goïi ñeå laáy thôøi gian moâ phoûng hieän haønh. time save_sim_time; initial
Kieåu döõ lieäu (tieáp theo) - Daûi. Daûi ñöôïc cho pheùp trong Verilog ñoái vôùi kieåu döõ lieäu register: reg, integer, time vaø vector. Daûi khoâng ñöôïc pheùp ñoái vôùi caùc bieán thöïc. Daûi ñöôïc truy caäp baèng: <array_name>[<subscript>] Verilog khoâng chaáp nhaän daûi nhieàu chieàu. Thí duï:
Kieåu döõ lieäu (tieáp theo) integer count[0:7]; // daûi 8 bieán count reg bool[31:0]; time chk_point[1:100]; reg [4:0] port_id[0:7]; // daûi 8 port_id, // moãi port roäng 5 bit integer matrix[4:0][4:0]; // sai count[5] // phaàn töû thöù 5 cuûa daûi caùc // bieán count
Kieåu döõ lieäu (tieáp theo) Ta khoâng ñöôïc nhaàm laãn daûi vôùi net vector hoaëc register vector . Moät vector laø moät phaàn töû duy nhaát roäng n-bit, trong khi ñoù daûi coù nhieàu phaàn töû, moãi phaàn töû coù theå roäng 1-bit hoaëc n-bit.
Kieåu döõ lieäu (tieáp theo) - Boä nhôù. Trong moâ phoûng maïch soá, ta thöôøng caàn moâ hình taäp thanh ghi (register file), RAM, ROM. Phaàn töû nhôù ñöôïc moâ hình trong Verilog ôû daïng daûi caùc thanh ghi. Moãi phaàn töû cuûa daûi ñöôïc xem laø moät word. Moãi word coù 1 hay nhieàu bit. Ñieàu quan troïng laø phaân bieät n thanh ghi 1-bit vôùi 1 thanh ghi n-bit. Moät töø cuï theå trong boä nhôù nhaän ñöôïc
Kieåu döõ lieäu (tieáp theo) // Boä nhôù mem1bit coù 1k töø 1-bit reg mem1bit[0:1023]; // Boä nhôù membyte coù 1k töø 1byte reg [7:0] membyte[0:1023]; // Tìm naïp töø 1-byte ôû ñòa chæ 511 membyte[511]
Kieåu döõ lieäu (tieáp theo) - Parameter. Verilog cho pheùp caùc haèng ñöôïc ñònh nghóa trong moät module baèng töø khoùa parameter. Parameter khoâng theå söû duïng laøm bieán. Giaù trò cuûa parameter ñoái vôùi moät theå hieän module coù theå bò ghi ñeø rieâng bieät ôû thôøi gian bieân dòch. Ñieàu naøy cho pheùp caùc theå hieän module laø tuøy yù. Ta seõ khaûo saùt sau. parameter port_id = 5; // ñònh nghóa // haèng
Kieåu döõ lieäu (tieáp theo) Parameter coù theå ñöôïc thay ñoåi vaøo luùc theå hieän module hoaëc baèng caùch söû duïng phaùt bieåu defparam (chöông 9). Nhö vaäy, vieäc söû duïng parameter laøm cho ñònh nghóa module linh hoaït. Haønh vi cuûa module coù theå thay ñoåi baèng caùch ñôn thuaàn thay ñoåi giaù trò cuûa parameter.
Kieåu döõ lieäu (tieáp theo) - Chuoãi. Chuoãi coù theå ñöôïc löu giöõ trong reg. Ñoä roäng cuûa bieán reg phaûi ñuû lôùn ñeå chöùa chuoãi. Moät kyù töï trong chuoãi chieám 1 byte. Verilog töï ñoäng ñieàn bit 0 hoaëc laøm troøn caùc bit beân traùi cuûa chuoãi. // khai baùo bieán roäng 18 byte. reg [8*18:1] string_value; initial
Kieåu döõ lieäu (tieáp theo) Caùc kyù töï ñaëc bieät ñöôïc daønh cho muïc ñích hieån thò chuoãi (chaúng haïn nhö newline, tab), hieån thò giaù trò cuûa ñoái soá. Caùc kyù töï ñaëc bieät naøy coù theå ñöôïc hieån thò trong chuoãi chæ khi chuùng ñöôïc ñöùng tröôùc baèng caùc kyù töï escaped, xem baûng ôû slide keá tieáp.
Kieåu döõ lieäu (tieáp theo) Kyù töï escaped Kyù töï hieån thò. \n newline \t tab %% % \\ \ \” “ \ooo Kyù töï ñöôïc vieát ôû daïng töø 1 ñeán 3 digit soá
Task heä thoáng Veriog cung caáp caùc task heä thoáng chuaån. Moïi task heä thoáng ñeàu xuaát hieän ôû daïng $. Nhöõng thao taùc nhö hieån thò treân maøn hình, giaùm saùt caùc giaù trò cuûa net, döøng vaø keát thuùc chöông trình v.v… ñeàu ñöôïc thöïc hieän bôûi task heä thoáng. Ta ñeà caäp ñeán vaøi task heä thoáng thoâng duïng nhaát.
Task heä thoáng (tieáp theo) - Hieån thò thoâng tin. $display laø task heä thoáng chính duøng ñeå hieån thò giaù trò cuûa bieán, chuoãi hoaëc bieåu thöùc. $display(p1, p2, . . ., pn); trong ñoù pi coù theå laø chuoãi, bieán hoaëc bieåu thöùc. $display töông töï nhö printf trong C. $display maëc ñònh cheøn moät doøng môùi ôû cuoái moät chuoãi.
Task heä thoáng (tieáp theo) Chuoãi coù theå ñöôïc ñònh daïng baèng caùch söû duïng caùc ñaëc taû daïng: %d/%D, %b/%B, %h/%H, %o/%O: hieån thò bieán ôû daïng soá thaäp phaân, nhò phaân, hex, baùt phaân. %s/%S, %c/%C, %v/%V, %m/%M: hieån thò chuoãi, kyù töï ASCII, ñoä maïnh, teân. %t/%T: hieån thò thôøi gian hieän
Task heä thoáng (tieáp theo) $display(“Hello Verilog World”); $display($time); reg [0:40] virtual_addr; $display(“At time %d virtual address is %h”, $time, virtual_addr); reg [4:0] port_id; $display(“ID of port is %b”, port_id); reg [3:0] bus; $display(“Bus value is %b”, bus); // Giaù trò hieån thò coù theå coù x hoaëc z)
Task heä thoáng (tieáp theo) // Hieån thò kyù töï ñaëc bieät, newline hoaëc //% $display(“This is a \n multiline string with a %% sign”); - - This is a - - multiline string with a % sign
Task heä thoáng (tieáp theo) - Giaùm saùt thoâng tin. Verilog cung caáp cô cheá giaùm saùt tín hieäu khi giaù trò cuûa tín hieäu naøy thay ñoåi. $monitor(p1, p2, . . ., pn);// goïi moät laàn. Thoâng soá pi coù theå laø bieán, teân tín hieäu, chuoãi. Khuoân daïng gioáng nhö $display. $monitor lieân tuïc giaùm saùt giaù trò cuûa bieán hoaëc tín hieäu ñöôïc chæ ra trong danh saùch thoâng soá vaø hieån thò moïi thoâng soá moãi khi coù moät
Task heä thoáng (tieáp theo) // Giaùm saùt thôøi gian vaø giaù trò cuûa clock // vaø reset. Clock ñoåi traïng thaùi moãi 5 //ñôn vò thôøi gian vaø reset tích cöïc ôû 10. initial begin $monitor($time, “Value of signal clock = %b reset = %b”, clock,
Task heä thoáng (tieáp theo) Hieån thò nhö sau: 0 Value of signal clock = 0 reset = 1 5 Value of signal clock = 1 reset = 1 10 Value of signal clock = 0 reset = 0
Task heä thoáng (tieáp theo) - Döøng vaø keát thuùc moâ phoûng. $stop $finish initial begin clock = 0; reset = 1; #100 $stop; // ôû cheá ñoä töông taùc. #900 $finish;
Chæ daãn trình bieân dòch - `define Chæ daãn `define duøng ñeå ñònh nghóa macro vaên baûn trong verilog, töông töï #define trong C. Caùc haèng vaø macro vaên baûn ñaõ ñònh nghóa ñöôïc söû duïng trong chöông trình Verilog baèng caùch ñaët tröôùc chuùng daáu `. Trình bieân dòch Verilog seõ thay theá vaên baûn cuûa macro ôû nôi coù `<macro_name>.
Chæ daãn trình bieân dòch (tieáp theo) // Ñònh nghóa macro vaên baûn xaùc ñònh // kích thöôùc maëc ñònh cuûa töø baèng caùch // söû duïng `WORD_SIZE. `define WORD_SIZE 32 // $stop seõ ñöôïc thay theá moãi khi gaëp `S `define S $stop; // Ñònh nghóa chuoãi thöôøng söû duïng.
Chæ daãn trình bieân dòch (tieáp theo) - `include Cho pheùp ta bao goàm toaøn boä noäi dung cuûa taäp tin Verilog nguoàn trong taäp tin Verilog khaùc trong thôøi gian bieân dòch. Töông töï nhö #include cuûa C. `include header.v