การออกแบบ 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