การออกแบบ VLSI - บทนำของ Verilog
Verilog เป็นภาษาคำอธิบายฮาร์ดแวร์ (HDL) เป็นภาษาที่ใช้สำหรับอธิบายระบบดิจิทัลเช่นสวิตช์เครือข่ายหรือไมโครโปรเซสเซอร์หรือหน่วยความจำหรือฟลิปฟล็อป หมายความว่าด้วยการใช้ HDL เราสามารถอธิบายฮาร์ดแวร์ดิจิทัลได้ทุกระดับ การออกแบบซึ่งอธิบายไว้ใน HDL นั้นไม่ขึ้นกับเทคโนโลยีง่ายมากสำหรับการออกแบบและการดีบักและโดยปกติจะมีประโยชน์มากกว่าแผนผังโดยเฉพาะอย่างยิ่งสำหรับวงจรขนาดใหญ่
Verilog สนับสนุนการออกแบบในหลายระดับของนามธรรม สามรายใหญ่ ได้แก่ -
- ระดับพฤติกรรม
- ระดับทะเบียน - โอน
- ระดับประตู
ระดับพฤติกรรม
ระดับนี้จะอธิบายระบบโดยอัลกอริทึมที่ทำงานพร้อมกัน (พฤติกรรม) ทุกอัลกอริทึมเป็นลำดับซึ่งหมายความว่าประกอบด้วยชุดคำสั่งที่ดำเนินการทีละคำสั่ง ฟังก์ชั่นงานและบล็อกเป็นองค์ประกอบหลัก ไม่มีการคำนึงถึงโครงสร้างของการออกแบบ
ลงทะเบียน − โอนเลเวล
การออกแบบโดยใช้ Register Register Transfer Level ระบุลักษณะของวงจรที่ใช้การทำงานและการถ่ายโอนข้อมูลระหว่างรีจิสเตอร์ คำจำกัดความสมัยใหม่ของรหัส RTL คือ "รหัสใด ๆ ที่สังเคราะห์ได้เรียกว่ารหัส RTL"
ระดับประตู
ภายในระดับตรรกะลักษณะของระบบจะอธิบายโดยลิงก์ตรรกะและคุณสมบัติของเวลา สัญญาณทั้งหมดเป็นสัญญาณที่ไม่ต่อเนื่อง ค่าเหล่านี้สามารถมีค่าตรรกะที่แน่นอนเท่านั้น (`0 ',` 1', `X ',` Z`) การดำเนินการที่ใช้งานได้เป็นพื้นฐานตรรกะที่กำหนดไว้ล่วงหน้า (ประตูพื้นฐาน) การสร้างแบบจำลองระดับประตูอาจไม่ใช่แนวคิดที่ถูกต้องสำหรับการออกแบบตรรกะ รหัสระดับประตูถูกสร้างขึ้นโดยใช้เครื่องมือเช่นเครื่องมือสังเคราะห์และ netlist ของเขาใช้สำหรับการจำลองระดับประตูและสำหรับแบ็กเอนด์
โทเค็นคำศัพท์
ไฟล์ข้อความต้นฉบับภาษา Verilog เป็นสตรีมของโทเค็นคำศัพท์ โทเค็นประกอบด้วยอักขระอย่างน้อยหนึ่งตัวและอักขระเดี่ยวแต่ละตัวจะอยู่ในโทเค็นเดียว
โทเค็นคำศัพท์พื้นฐานที่ใช้โดย Verilog HDL นั้นคล้ายกับโทเค็นในภาษาการเขียนโปรแกรม C Verilog เป็นกรณีที่ละเอียดอ่อน คำสำคัญทั้งหมดเป็นตัวพิมพ์เล็ก
พื้นที่สีขาว
ช่องว่างสีขาวสามารถมีอักขระสำหรับช่องว่างแท็บบรรทัดใหม่และฟีดแบบฟอร์ม อักขระเหล่านี้จะถูกละเว้นยกเว้นเมื่อใช้เพื่อแยกโทเค็น
อักขระช่องว่างคือช่องว่างแท็บการคืนค่าขนส่งขึ้นบรรทัดใหม่และฟีดฟอร์ม
ความคิดเห็น
มีสองรูปแบบเพื่อแสดงความคิดเห็น
- 1) ความคิดเห็นบรรทัดเดียวเริ่มต้นด้วยโทเค็น // และลงท้ายด้วยการคืนค่าขนส่ง
ตัวอย่าง: // นี่คือไวยากรณ์บรรทัดเดียว
- 2) ความคิดเห็นหลายบรรทัดเริ่มต้นด้วยโทเค็น / * และลงท้ายด้วยโทเค็น * /
ตัวอย่าง: / * นี่คือไวยากรณ์หลายบรรทัด * /
ตัวเลข
คุณสามารถระบุตัวเลขในรูปแบบไบนารีฐานแปดทศนิยมหรือฐานสิบหก ตัวเลขเชิงลบจะแสดงเป็นตัวเลขชมเชย 2 Verilog อนุญาตให้ใช้เลขจำนวนเต็มจำนวนจริงและตัวเลขที่ลงชื่อและไม่ได้ลงชื่อ
ไวยากรณ์ถูกกำหนดโดย - <size> <radix> <value>
ขนาดหรือจำนวนที่ไม่ได้กำหนดขนาดสามารถกำหนดได้ใน <Size> และ <radix> กำหนดว่าเป็นเลขฐานสองฐานแปดเลขฐานสิบหกหรือฐานสิบ
ตัวระบุ
Identifier คือชื่อที่ใช้ในการกำหนดวัตถุเช่นฟังก์ชันโมดูลหรือรีจิสเตอร์ ตัวระบุควรขึ้นต้นด้วยอักขระตามตัวอักษรหรืออักขระขีดล่าง เช่น A_Z, a_z, _
Identifiers คือการผสมระหว่างตัวอักษรตัวเลขเครื่องหมายขีดล่างและอักขระ $ มีความยาวได้ถึง 1024 อักขระ
ตัวดำเนินการ
ตัวดำเนินการคืออักขระพิเศษที่ใช้เพื่อวางเงื่อนไขหรือใช้งานตัวแปร มีอักขระหนึ่งสองและสามตัวที่ใช้ในการดำเนินการกับตัวแปร
เช่น >, +, ~, &! =.
คีย์เวิร์ด Verilog
คำที่มีความหมายพิเศษใน Verilog เรียกว่าคำหลัก Verilog ตัวอย่างเช่นกำหนด case, while, wire, reg และหรือ nand และ module ไม่ควรใช้เป็นตัวระบุ คีย์เวิร์ด Verilog ยังรวมถึงคำสั่งคอมไพเลอร์และงานระบบและฟังก์ชัน
การสร้างแบบจำลองระดับประตู
Verilog มีแบบดั้งเดิมในตัวเช่นลอจิกเกตประตูส่งและสวิตช์ สิ่งเหล่านี้แทบไม่ได้ใช้สำหรับงานออกแบบ แต่ใช้ในโลกหลังการสังเคราะห์สำหรับการสร้างแบบจำลองของเซลล์ ASIC / FPGA
แบบจำลองระดับประตูแสดงคุณสมบัติสองประการ -
Drive strength- ความแข็งแรงของประตูเอาต์พุตกำหนดโดยความแรงของไดรฟ์ เอาต์พุตจะแข็งแกร่งที่สุดหากมีการเชื่อมต่อโดยตรงกับแหล่งที่มา ความแข็งแรงจะลดลงหากการเชื่อมต่อผ่านทรานซิสเตอร์ตัวนำและน้อยที่สุดเมื่อเชื่อมต่อผ่านตัวต้านทานแบบดึงขึ้น / ลง มักจะไม่ระบุความแรงของไดรฟ์ซึ่งในกรณีนี้จุดแข็งจะมีค่าเริ่มต้นเป็น strong1 และ strong0
Delays- หากไม่ได้ระบุความล่าช้าประตูจะไม่มีความล่าช้าในการขยายพันธุ์ หากมีการระบุความล่าช้าสองรายการรายการแรกหมายถึงความล่าช้าที่เพิ่มขึ้นและความล่าช้าที่สอง หากระบุการหน่วงเวลาเพียงครั้งเดียวการขึ้นและลงทั้งสองจะเท่ากัน ความล่าช้าอาจถูกละเลยในการสังเคราะห์
ประตูดั้งเดิม
ลอจิกเกตพื้นฐานที่ใช้เอาต์พุตเดียวและอินพุตจำนวนมากถูกใช้ใน Verilog GATE ใช้หนึ่งในคีย์เวิร์ด - and, nand, or, nor, xor, xnor สำหรับใช้ใน Verilog สำหรับอินพุตจำนวน N และเอาต์พุต 1 เอาต์พุต
Example:
Module gate()
Wire ot0;
Wire ot1;
Wire ot2;
Reg in0,in1,in2,in3;
Not U1(ot0,in0);
Xor U2(ot1,in1,in2,in3);
And U3(ot2, in2,in3,in0)
ดั้งเดิมของ Transmission Gate
ดั้งเดิมของ Transmission gate ประกอบด้วยทั้งบัฟเฟอร์และอินเวอร์เตอร์ มีอินพุตเดียวและเอาต์พุตอย่างน้อยหนึ่งรายการ ในไวยากรณ์เกตอินสแตนซ์ที่แสดงด้านล่างนี้ GATE ย่อมาจากคำหลัก buf หรือ NOT gate
ตัวอย่าง: Not, buf, bufif0, bufif1, notif0, notif1
ไม่ - n outout อินเวอร์เตอร์
บัฟเฟอร์เอาต์พุต Buf - n
Bufifo - บัฟเฟอร์ tristate เปิดใช้งานต่ำ
Bufif1 - บัฟเฟอร์ tristate เปิดใช้งานสูง
Notifo - อินเวอร์เตอร์ tristate เปิดใช้งานต่ำ
Notif1 - อินเวอร์เตอร์ tristate เปิดใช้งานสูง
Example:
Module gate()
Wire out0;
Wire out1;
Reg in0,in1;
Not U1(out0,in0);
Buf U2(out0,in0);
ประเภทข้อมูล
ชุดค่า
Verilog ประกอบด้วยค่าพื้นฐานสี่ค่าเป็นหลัก ชนิดข้อมูล Verilog ทั้งหมดซึ่งใช้ใน Verilog เก็บค่าเหล่านี้ -
0 (ศูนย์ลอจิกหรือเงื่อนไขเท็จ)
1 (ลอจิกหนึ่งหรือเงื่อนไขจริง)
x (ค่าตรรกะที่ไม่รู้จัก)
z (สถานะอิมพีแดนซ์สูง)
การใช้ x และ z มีข้อ จำกัด ในการสังเคราะห์
ลวด
ลวดใช้เพื่อแสดงลวดทางกายภาพในวงจรและใช้สำหรับเชื่อมต่อประตูหรือโมดูล ค่าของสายสามารถอ่านได้เท่านั้นและไม่ได้กำหนดในฟังก์ชันหรือบล็อก ลวดไม่สามารถจัดเก็บค่าได้ แต่จะขับเคลื่อนด้วยคำสั่งการกำหนดแบบต่อเนื่องหรือโดยการเชื่อมต่อสายเข้ากับเอาต์พุตของเกต / โมดูล สายไฟประเภทอื่น ๆ ได้แก่ -
Wand (wired-AND) - ค่า Wand ที่นี่ขึ้นอยู่กับตรรกะ AND ของไดรเวอร์อุปกรณ์ทั้งหมดที่เชื่อมต่ออยู่
Wor (wired-OR) - ค่าของ Wor ขึ้นอยู่กับตรรกะหรือของไดรเวอร์อุปกรณ์ทั้งหมดที่เชื่อมต่ออยู่
Tri (three-state) - ที่นี่ไดรเวอร์ทั้งหมดที่เชื่อมต่อกับไตรต้องเป็น z ยกเว้นเพียงตัวเดียว (ซึ่งกำหนดค่าของไตร)
Example:
Wire [msb:lsb] wire_variable_list;
Wirec // simple wire
Wand d;
Assign d = a; // value of d is the logical AND of
Assign d = b; // a and b
Wire [9:0] A; // a cable (vector) of 10 wires.
Wand [msb:lsb] wand_variable_list;
Wor [msb:lsb] wor_variable_list;
Tri [msb:lsb] tri_variable_list;
ลงทะเบียน
reg (register) คืออ็อบเจ็กต์ข้อมูลซึ่งเก็บค่าจากการกำหนดโพรซีเดอร์หนึ่งไปยังขั้นตอนถัดไปและใช้เฉพาะในฟังก์ชันและบล็อกโพรซีเดอร์ Reg คือ Verilog ธรรมดาซึ่งเป็นรีจิสเตอร์ประเภทตัวแปรและไม่สามารถบ่งบอกถึงการลงทะเบียนทางกายภาพได้ ในการลงทะเบียนแบบหลายบิตข้อมูลจะถูกจัดเก็บในรูปแบบของตัวเลขที่ไม่ได้ลงชื่อและไม่ได้ใช้นามสกุล
ตัวอย่าง -
reg c; // ตัวแปรรีจิสเตอร์ 1 บิตเดียว
reg [5: 0] อัญมณี; // เวกเตอร์ 6 บิต;
reg [6: 0] ง, จ; // สองตัวแปร 7 บิต
อินพุตเอาต์พุต Inout
คำสำคัญเหล่านี้ใช้เพื่อประกาศพอร์ตอินพุตเอาต์พุตและแบบสองทิศทางของงานหรือโมดูล ที่นี่พอร์ตอินพุตและอินเอาต์ซึ่งเป็นประเภทสายไฟและพอร์ตเอาต์พุตได้รับการกำหนดค่าให้เป็นประเภท wire, reg, wand, wor หรือ tri ค่าเริ่มต้นคือประเภทสายเสมอ
Example
Module sample(a, c, b, d);
Input c; // An input where wire is used.
Output a, b; // Two outputs where wire is used.
Output [2:0] d; /* A three-bit output. One must declare type in a separate statement. */
reg [1:0] a; // The above ‘a’ port is for declaration in reg.
จำนวนเต็ม
จำนวนเต็มใช้ในตัวแปรวัตถุประสงค์ทั่วไป ส่วนใหญ่จะใช้ในการบ่งชี้ลูปค่าคงที่และพารามิเตอร์ เป็นประเภทข้อมูลประเภท 'reg' พวกเขาจัดเก็บข้อมูลเป็นตัวเลขที่ลงนามในขณะที่ประเภท reg ที่ประกาศไว้อย่างชัดเจนจะจัดเก็บข้อมูลเหล่านี้เป็นข้อมูลที่ไม่ได้ลงชื่อ หากไม่ได้กำหนดจำนวนเต็มในขณะคอมไพล์ขนาดเริ่มต้นจะเป็น 32 บิต
หากจำนวนเต็มมีค่าคงที่ซินธิไซเซอร์จะปรับให้มีความกว้างต่ำสุดที่จำเป็นในขณะคอมไพล์
Example
Integer c; // single 32-bit integer
Assign a = 63; // 63 defaults to a 7-bit variable.
ซัพพลาย 0, ซัพพลาย 1
Supply0 กำหนดสายที่เชื่อมโยงกับลอจิก 0 (กราวด์) และซัพพลาย 1 กำหนดสายไฟที่เชื่อมโยงกับลอจิก 1 (กำลัง)
Example
supply0 logic_0_wires;
supply0 gnd1; // equivalent to a wire assigned as 0
supply1 logic_1_wires;
supply1 c, s;
เวลา
เวลาเป็นปริมาณ 64 บิตที่สามารถใช้ร่วมกับงานระบบ $ time เพื่อเก็บเวลาจำลอง ไม่สนับสนุนเวลาสำหรับการสังเคราะห์ดังนั้นจึงใช้เพื่อวัตถุประสงค์ในการจำลองเท่านั้น
Example
time time_variable_list;
time c;
c = $time; //c = current simulation time
พารามิเตอร์
พารามิเตอร์กำลังกำหนดค่าคงที่ซึ่งสามารถตั้งค่าได้เมื่อคุณใช้โมดูลซึ่งอนุญาตให้ปรับแต่งโมดูลในระหว่างกระบวนการสร้างอินสแตนซ์
Example
Parameter add = 3’b010, sub = 2’b11;
Parameter n = 3;
Parameter [2:0] param2 = 3’b110;
reg [n-1:0] jam; /* A 3-bit register with length of n or above. */
always @(z)
y = {{(add - sub){z}};
if (z)
begin
state = param2[1];
else
state = param2[2];
end
ตัวดำเนินการ
ตัวดำเนินการเลขคณิต
ตัวดำเนินการเหล่านี้ดำเนินการคำนวณทางคณิตศาสตร์ + และ − ใช้เป็นตัวดำเนินการยูนารี (x) หรือไบนารี (z − y)
ตัวดำเนินการที่รวมอยู่ในการคำนวณทางคณิตศาสตร์ ได้แก่ -
+ (การบวก), - (การลบ), * (การคูณ), / (การหาร),% (โมดูลัส)
Example -
parameter v = 5;
reg[3:0] b, d, h, i, count;
h = b + d;
i = d - v;
cnt = (cnt +1)%16; //Can count 0 thru 15.
ตัวดำเนินการเชิงสัมพันธ์
ตัวดำเนินการเหล่านี้เปรียบเทียบตัวถูกดำเนินการสองตัวและส่งคืนผลลัพธ์เป็นบิตเดียว 1 หรือ 0
ตัวแปร Wire และ reg เป็นค่าบวก ดังนั้น (−3'd001) = = 3'd111 และ (−3b001)> 3b110
ตัวดำเนินการที่รวมอยู่ในการดำเนินการเชิงสัมพันธ์ ได้แก่ -
- == (เท่ากับ)
- ! = (ไม่เท่ากับ)
- > (มากกว่า)
- > = (มากกว่าหรือเท่ากับ)
- <(น้อยกว่า)
- <= (น้อยกว่าหรือเท่ากับ)
Example
if (z = = y) c = 1;
else c = 0; // Compare in 2’s compliment; d>b
reg [3:0] d,b;
if (d[3]= = b[3]) d[2:0] > b[2:0];
else b[3];
Equivalent Statement
e = (z == y);
ตัวดำเนินการที่ชาญฉลาด
ตัวดำเนินการที่ชาญฉลาดซึ่งกำลังทำการเปรียบเทียบแบบบิตต่อบิตระหว่างตัวถูกดำเนินการสองตัว
ตัวดำเนินการที่รวมอยู่ในการทำงานของ Bit wise ได้แก่ -
- & (บิตและ)
- | (bitwiseOR)
- ~ (บิตไม่)
- ^ (XOR แบบบิต)
- ~ ^ หรือ ^ ~ (บิต XNOR)
Example
module and2 (d, b, c);
input [1:0] d, b;
output [1:0] c;
assign c = d & b;
end module
ตัวดำเนินการทางตรรกะ
ตัวดำเนินการทางตรรกะเป็นตัวดำเนินการที่ชาญฉลาดและใช้สำหรับตัวถูกดำเนินการบิตเดียวเท่านั้น พวกเขาส่งคืนค่าบิตเดียว 0 หรือ 1 สามารถทำงานกับจำนวนเต็มหรือกลุ่มของบิตนิพจน์และถือว่าค่าที่ไม่ใช่ศูนย์ทั้งหมดเป็น 1 โดยทั่วไปแล้วตัวดำเนินการทางตรรกะจะใช้ในคำสั่งเงื่อนไขเนื่องจากทำงานกับนิพจน์
ตัวดำเนินการที่รวมอยู่ในการดำเนินการเชิงตรรกะ ได้แก่ -
- ! (ตรรกะไม่)
- && (ตรรกะ AND)
- || (ตรรกะหรือ)
Example
wire[7:0] a, b, c; // a, b and c are multibit variables.
reg x;
if ((a == b) && (c)) x = 1; //x = 1 if a equals b, and c is nonzero.
else x = !a; // x =0 if a is anything but zero.
ตัวดำเนินการลด
ตัวดำเนินการการลดเป็นรูปแบบเอกพจน์ของตัวดำเนินการบิตและดำเนินการกับบิตทั้งหมดของเวกเตอร์ตัวถูกดำเนินการ สิ่งเหล่านี้ส่งคืนค่าบิตเดียว
ตัวดำเนินการที่รวมอยู่ในการดำเนินการลด ได้แก่ -
- & (ลดและ)
- | (ลดหรือ)
- ~ & (ลด NAND)
- ~ | (ลด NOR)
- ^ (ลด XOR)
- ~ ^ หรือ ^ ~ (ลด XNOR)
Example
Module chk_zero (x, z);
Input [2:0] x;
Output z;
Assign z = & x; // Reduction AND
End module
ตัวดำเนินการกะ
ตัวดำเนินการ Shift ซึ่งขยับตัวถูกดำเนินการตัวแรกตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการที่สองในไวยากรณ์ ตำแหน่งที่ว่างจะเต็มไปด้วยเลขศูนย์สำหรับทั้งสองทิศทางการเลื่อนซ้ายและขวา (ไม่มีส่วนขยายเครื่องหมายใช้)
ตัวดำเนินการที่รวมอยู่ในการทำงานของ Shift ได้แก่ -
- << (เลื่อนไปทางซ้าย)
- >> (เลื่อนไปทางขวา)
Example
Assign z = c << 3; /* z = c shifted left 3 bits;
ตำแหน่งว่างจะเต็มไปด้วย 0's * /
ตัวดำเนินการเชื่อมต่อ
ตัวดำเนินการเรียงต่อกันจะรวมตัวถูกดำเนินการสองตัวขึ้นไปเพื่อสร้างเวกเตอร์ที่ใหญ่ขึ้น
ตัวดำเนินการที่รวมอยู่ในการดำเนินการต่อคือ - {} (การเรียงต่อกัน)
Example
wire [1:0] a, h; wire [2:0] x; wire [3;0] y, Z;
assign x = {1’b0, a}; // x[2] = 0, x[1] = a[1], x[0] = a[0]
assign b = {a, h}; /* b[3] = a[1], b[2] = a[0], b[1] = h[1],
b[0] = h[0] */
assign {cout, b} = x + Z; // Concatenation of a result
ตัวดำเนินการจำลอง
ตัวดำเนินการจำลองแบบกำลังทำสำเนาหลายรายการ
ตัวดำเนินการที่ใช้ในการจำลองแบบคือ - {n {item}} (การจำลองรายการแบบพับ n)
Example
Wire [1:0] a, f; wire [4:0] x;
Assign x = {2{1’f0}, a}; // Equivalent to x = {0,0,a }
Assign y = {2{a}, 3{f}}; //Equivalent to y = {a,a,f,f}
For synthesis, Synopsis did not like a zero replication.
For example:-
Parameter l = 5, k = 5;
Assign x = {(l-k){a}}
ตัวดำเนินการตามเงื่อนไข
ตัวดำเนินการตามเงื่อนไขสังเคราะห์เป็นมัลติเพล็กเซอร์ เป็นชนิดเดียวกับที่ใช้ใน C / C ++ และประเมินหนึ่งในสองนิพจน์ตามเงื่อนไข
ตัวดำเนินการที่ใช้ในการดำเนินการตามเงื่อนไขคือ -
(เงื่อนไข) ? (ผลลัพธ์หากเงื่อนไขเป็นจริง) -
(ผลลัพธ์หากเงื่อนไขเป็นเท็จ)
Example
Assign x = (g) ? a : b;
Assign x = (inc = = 2) ? x+1 : x-1;
/* if (inc), x = x+1, else x = x-1 */
โอเปร่า
ตัวอักษร
ตัวอักษรเป็นตัวถูกดำเนินการที่มีค่าคงที่ซึ่งใช้ในนิพจน์ Verilog ตัวอักษร Verilog ที่ใช้กันทั่วไปสองตัวคือ -
String - ตัวดำเนินการตามตัวอักษรสตริงคืออาร์เรย์ของอักขระหนึ่งมิติซึ่งอยู่ในเครื่องหมายคำพูดคู่ ("")
Numeric - ตัวถูกดำเนินการตัวเลขคงที่ระบุเป็นเลขฐานสองฐานแปดทศนิยมหรือเลขฐานสิบหก
Example
n - จำนวนเต็มแทนจำนวนบิต
F - หนึ่งในสี่รูปแบบพื้นฐานที่เป็นไปได้ -
b สำหรับไบนารี, o สำหรับฐานแปด, d สำหรับทศนิยม, h สำหรับเลขฐานสิบหก
“time is” // string literal
267 // 32-bit decimal number
2’b01 // 2-bit binary
20’hB36F // 20-bit hexadecimal number
‘062 // 32-bit octal number
สายไฟ Regs และพารามิเตอร์
สายไฟ regs และพารามิเตอร์เป็นชนิดข้อมูลที่ใช้เป็นตัวถูกดำเนินการในนิพจน์ Verilog
Bit-Selection“ x [2]” และ Part-Selection“ x [4: 2]”
การเลือกบิตและการเลือกบางส่วนใช้เพื่อเลือกหนึ่งบิตและหลายบิตตามลำดับจากลวดเรกหรือเวกเตอร์พารามิเตอร์โดยใช้วงเล็บเหลี่ยม“ []” Bit-selects และ part-selects ยังใช้เป็นตัวถูกดำเนินการในนิพจน์ในลักษณะเดียวกับที่ใช้อ็อบเจ็กต์ข้อมูลหลัก
Example
reg [7:0] x, y;
reg [3:0] z;
reg a;
a = x[7] & y[7]; // bit-selects
z = x[7:4] + y[3:0]; // part-selects
ฟังก์ชั่นการโทร
ในการเรียกใช้ฟังก์ชันค่าส่งกลับของฟังก์ชันจะถูกใช้โดยตรงในนิพจน์โดยไม่จำเป็นต้องกำหนดให้กับรีจิสเตอร์หรือการต่อสายก่อน เพียงแค่วางการเรียกใช้ฟังก์ชันเป็นหนึ่งในประเภทของตัวถูกดำเนินการจำเป็นอย่างยิ่งเพื่อให้แน่ใจว่าคุณทราบความกว้างบิตของค่าส่งคืนของการเรียกฟังก์ชัน
Example
Assign x = y & z & chk_yz(z, y); // chk_yz is a function
. . ./* Definition of the function */
Function chk_yz; // function definition
Input z,y;
chk_yz = y^z;
End function
โมดูล
การประกาศโมดูล
ใน Verilog โมดูลคือเอนทิตีการออกแบบหลัก สิ่งนี้ระบุชื่อและรายการพอร์ต (อาร์กิวเมนต์) ไม่กี่บรรทัดถัดไปซึ่งระบุประเภทอินพุต / เอาต์พุต (อินพุตเอาต์พุตหรืออินพุต) และความกว้างของแต่ละพอร์ต ความกว้างของพอร์ตเริ่มต้นคือ 1 บิตเท่านั้น ต้องประกาศตัวแปรพอร์ตด้วยลวดไม้กายสิทธิ์ . ., reg. ตัวแปรพอร์ตเริ่มต้นคือสาย โดยปกติอินพุตจะเป็นแบบต่อสายเนื่องจากข้อมูลของมันถูกสลักอยู่นอกโมดูล เอาต์พุตเป็นประเภท reg หากสัญญาณถูกเก็บไว้ภายใน
Example
module sub_add(add, in1, in2, out);
input add; // defaults to wire
input [7:0] in1, in2; wire in1, in2;
output [7:0] out; reg out;
... statements ...
End module
การมอบหมายงานอย่างต่อเนื่อง
การกำหนดแบบต่อเนื่องในโมดูลใช้สำหรับกำหนดค่าบนสายซึ่งเป็นการกำหนดปกติที่ใช้นอกบล็อกเสมอหรือเริ่มต้น การมอบหมายนี้ทำด้วยคำสั่งมอบหมายอย่างชัดเจนหรือเพื่อกำหนดค่าให้กับลวดในระหว่างการประกาศ การมอบหมายงานอย่างต่อเนื่องจะดำเนินการอย่างต่อเนื่องในขณะจำลอง ลำดับของการกำหนดงบไม่มีผลกับมัน หากคุณทำการเปลี่ยนแปลงใด ๆ ในสัญญาณอินพุตด้านขวามือสัญญาณจะเปลี่ยนสัญญาณเอาต์พุตด้านซ้ายมือ
Example
Wire [1:0] x = 2’y01; // assigned on declaration
Assign y = c | d; // using assign statement
Assign d = a & b;
/* the order of the assign statements does not matter. */
โมดูลอินสแตนซ์
การประกาศโมดูลเป็นเทมเพลตสำหรับการสร้างวัตถุจริง โมดูลถูกสร้างอินสแตนซ์ภายในโมดูลอื่น ๆ และแต่ละอินสแตนซ์กำลังสร้างอ็อบเจ็กต์เดียวจากเทมเพลตนั้น ข้อยกเว้นคือโมดูลระดับบนสุดซึ่งเป็นอินสแตนซ์ของตัวเอง พอร์ตของโมดูลจะต้องตรงกับพอร์ตที่กำหนดไว้ในเทมเพลต มีการระบุ -
By nameโดยใช้จุด“ .template port name (ชื่อสายไฟที่เชื่อมต่อกับพอร์ต)” หรือ
By positionวางพอร์ตไว้ที่เดียวกันในรายการพอร์ตของทั้งเทมเพลตและอินสแตนซ์
Example
MODULE DEFINITION
Module and4 (x, y, z);
Input [3:0] x, y;
Output [3:0] z;
Assign z = x | y;
End module