Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Verilog Intro: Part 1 Hardware Design Languages • A Hardware Description Language (HDL) is a language used to describe a digital system, for example, a computer or a component of a computer. • A digital system can be described at several levels: • Switch level: wires, resistors and transistors • Gate level: logical gates and flip flops • Register Transfer Level (RTL): registers and the transfers of information between registers. • Two Major HDLs in Industry – VHDL – Verilog HDL Verilog HDL vs. VHDL VHDL • “V” is short for Very High Speed Integrated Circuits. • Designed for and sponsored by US Department of Defense. • Designed by committee (1981-1985). • Syntax based on Ada programming language. • Was made an IEEE Standard in 1987. Verilog HDL (VHDL) • Was introduced in 1985 by Gateway Design System Corporation, now a part of Cadence Design Systems, Inc.'s Systems Division. • Was made an IEEE Standard in 1995 • Syntax based on C programming language. Design Methodology Identifiers • An identifier is composed of a space-free sequence of uppercase and lowercase letters from alphabet, digits (0,1,….9), underscore (_), and the $ symbol. • Verilog is a case sensitive language. – c_out_bar and C_OUT_BAR are two different identifiers • The name of a variable may not begin with a digit or $, and may be up to 1,024 characters long. – e.g. clock_, state_3 Comments • There are two kinds of comments: single line and multiline. • A single-line comment begins with two forward slashes (//) • A multiline comment begins with the pair of characters /* and terminate with the characters */ • Example: – // This is a single-line comments – /* This is a multiline comments more comments here …………………………………. */ Numbers • Numbers are specified using the following form <size><base format><number> • Size: a decimal number specifies the size of the number in bits. • Base format: is the character the following characters ’ followed by one of – b for binary,d for decimal,o(octal),h(hex). • Number: set of digits to represent the number. Numbers • Example : x = 347 // decimal number x = 4’b101 // 4- bit binary number 0101 x = 6’o12 // 6-bit octal number x = 16’h87f7 // 16-bit hex number h87f7 x = 2’b101010 x = 2’d83 • String in double quotes “ this is an introduction” Operators • Bitwise Operators ~ NOT & AND | OR ^ XOR ~| NOR ~& NAND ^~ or ~^ XNOR • Logical & Relational Operators !, &&, | |, ==, !=, >=, <=, >, < Operators • Arithmetic Operators +, -, *, / , % • Concatenation & Replication Operators {identifier_1, identifier_2, …} {n{identifier}} – Examples: {REG_IN[6:0],Serial_in}, {8 {1’b0}} Value Logic System • Data type for signals • Bits (value on a wire) – 0, 1 – x unknow value • Vectors of bits (parallel wires or registers) – A[3:0] is a vector of 4 bits: A[3], A[2], A[1], A[0] – Concatenating bits/vectors into a vector • B[7:0] = {A[3], A[3], A[3], A[3], A[3:0]}; • B[7:0] = {3{A[3]}, A[3:0]}; Data Types: Constants • A constant is declared with the keyword parameter in a statement assigning a name and a value to the constant • The value of a constant is fixed during simulation. • Examples: – parameter HIGH_INDEX= 31; // integer – parameter BYTE_SIZE = 8; Data Types: Variables • • • • • • • • Two basic families of data types for variables: Nets and Registers Net variables – e.g. wire Variable used simply to connect components together Usually corresponds to a wire in the circuit. Register variables – e.g. reg Variable used to store data as part of a behavioral description Like variables in ordinary procedural languages Note: – reg should only be used with always and initial blocks (to be presented …) – The reg variables store the last value that was procedurally assigned to them whereas the wire variables represent physical connections between structural entities such as gates. Continuous Assignment • A continuous assignment statement is declared with the keyword assign, followed by a net(e.g. type wire) variable, an assignment operator(=), and an expression. • assign corresponds to a connection. • Target is never a reg variable. – – – – assign A = B | (C & ~D); // not the use of ~ not ! assign B[3:0] = 4'b01XX; assign C[15:0] = 16'h00ff; //(MSB:LSB) Assign {Cout, S[3:0]} = A[3:0] + B[3:0] + Cin; Procedural Assignment & String • Procedural assignments have the form <reg variable> = <expression> • where the <reg variable> must be a register or memory. • e.g. reg enable, d; enable = 0; d = 0; Primitives • No declaration required (predefined) ; • Can only be instantiated • Example: and a1 (C, A, B); //instance name – Usually better to provide instance name for debugging. • Example: • Example: or o1 (SET, ~A, C ), o2(N, ABC,SET ); and #(10) a2(o, i1, i2); // name + delay Program Structure: Modules • Any digital system is a set of modules. • Modules may run concurrently, but usually there is one top level module to specify a closed system containing both test data and hardware models. The top level module invokes instances of other modules. • A module is never called, it is instantiated. • Modules can be specified behaviorally or structurally (or a combination of the two). • A behavioral specification defines the behavior of a digital system using traditional programming language constructs (e. g.,if else, assignment statements). • A structural specification expresses the behavior of a digital system (module) as a hierarchical interconnection of submodules. The Structure of a Module • The structure of a module is the following: module <module name> (<port list>); <declares> <module items> endmodule • <module name> is an identifier that uniquely names the module. • <port list> is a list of input, output and inout ports which are used to connect to other modules. • <declares> specifies data objects as registers, memories & wires as wells as procedural constructs such as functions & tasks. • <module items> may be – – – – initial constructs, always constructs, continuous assignments or instances of modules. Taste of Verilog Module name Module ports module Add_half ( sum, c_out, a, b ); input a, b; Declaration of port output sum, c_out; modes wire c_out_bar; Declaration of internal signal xor (sum, a, b); nand (c_out_bar, a, b); not (c_out, c_out_bar); endmodule Verilog keywords Instantiation of primitive gates a b sum c_out_bar c_out Taste of Verilog module Add_half ( sum, c_out, a, b ); input a, b; output sum, c_out; assign {c_out, sum} = a + b; endmodule a b sum c_out_bar c_out Using Verilogger Pro • An evaluation version is included in a the CD coming with your text book. • Start Verilogger StartProgramSynaptiCadVerilogger Pro.. How to Write a new code • • • • Open any text editor. Write in your code. Save the file with .v extension. Test your code using Verilogger Pro; – Start Verilogger Pro – Right click the project window and select add hdl file – Click the triangular green button from the tools bar to run the code. – If you have any errors you will see them the report window. Test Bench module <test module name> ; // Data type declaration // Instantiate module ( call the module that is going to be tested) // Apply the stimulus // Display results endmodule Test Bench Example module test_my_nand; // Test bench to test half adder reg A, B; wire s, cOut; Add_half test( s, cOut, A, B ); // instantiate my_NAND. initial begin end // apply the stimulus, test data A = 1'b0; B = 1'b0; #100 A = 1'b1; // delay one simulation cycle, then change A=>1. #100 B = 1'b1; #100 A = 1'b0; initial #500 $finish; initial begin end endmodule // setup monitoring //$monitor("Time=%0d a=%b b=%b out1=%b", $time, A, B, F); User-Defined Primitives // User defined primitive(UDP) primitive UDP_1 (F,A,B,C); output F; // only one output is allowed input A,B,C; // Truth table for F(A,B,C) = Minterms (0,2,4,6,7) table // A B C : F (Note that this is only a comment) 0 0 0 : 1; 0 0 1 : 0; 0 1 0 : 1; 0 1 1 : 0; 1 0 0 : 1; 1 0 1 : 0; 1 1 0 : 1; 1 1 1 : 1; endtable endprimitive Procedural Blocks • There are two types of procedural blocks in Verilog. – initial for single-pass behavior : initial blocks execute only once at time zero (start execution at time zero). – always for cyclic behavior: always blocks loop to execute over and over again, in other words as name means, it executes always. • Procedural assignment may only appear in initial and always constructs. • The initial and always constructs are used to model sequential logic. • Continuous statement is used to model combinational logic. Example: Initial Block module initial_example(); reg clk,reset,enable,data; initial begin clk = 0; reset = 0; The initial block is executed at time 0. Initial block just execute all the statements enable = 0; within begin and end statements. data = 0; end endmodule Control Constructs • Control Constructs – Can be used in the procedural sections of code. • Selection – if statement: if (A == 4) begin B = 2; end else begin B = 4; end – case statements: case (<expression>) <value1>: <statement> <value2>: <statement> default: <statement> endcase Example: 4-1 MUX in behavioral (1) module mux4 (sel, A, B, C, D, Y); input [1:0] sel; // 2-bit control signal A input A, B, C, D; B output Y; C reg Y; // target of assignment D always @(sel or A or B or C or D) If (sel == 2’b00) Y = A; else if (sel == 2’b01) Y = B; Sel[1:0] else if (sel == 2’b10) Y = C; else if (sel == 2’b11) Y = D; endmodule Y Example: 4-1 MUX in behavioral (2) // 4-1 mux using case statement module mux4 (sel, A, B, C, D, Y); input [1:0] sel; // 2-bit control signal input A, B, C, D; output Y; reg Y; // target of assignment always @(sel or A or B or C or D) case (sel) 2’b00: Y = A; 2’b01: Y = B; 2’b10: Y = C; 2’b11: Y = D; endcase endmodule A B Y C D Sel[1:0] Example: 4-1 MUX in behavioral (3) // 4-1 mux using case statement module mux4 (select, d, q); input [1:0] select; // 2-bit control signal input [3:0] d; output q; reg q; // target of assignment always @(select or d) case (select) 2’b00: q = d[0]; 2’b01: q = d[1]; 2’b10: q = d[2]; 2’b11: q = d[3]; endcase endmodule Example: 4-1 MUX in structural module mux4( select, d, q ); input[1:0] select; input[3:0] d; output q; wire q, q1, q2, q3, q4, NOTselect0, NOTselect1; wire[1:0] select; wire[3:0] d; not n1( NOTselect0, select[0] ); not n2( NOTselect1, select[1] ); and a1( q1, NOTselect0, NOTselect1, d[0] ); and a2( q2, select[0], NOTselect1, d[1] ); and a3( q3, NOTselect0, select[1], d[2] ); and a4( q4, select[0], select[1], d[3] ); or o1( q, q1, q2, q3, q4 ); endmodule Another Example: 4-bit Full Adder using 1-bit Full Adder module FourBitAdder( sum, c_out, x, y, c_in); output [3:0] sum; output c_out; input [3:0] x, y; input c_in; wire c1, c2, c3; fulladder fa0( sum[0], c1, x[0], y[0], c_in ); fulladder fa1( sum[1], c2, x[1], y[1], c1 ); fulladder fa2( sum[2], c3, x[2], y[2], c2 ); fulladder fa3( sum[3], c_out, x[3], y[3], c3 ); endmodule module fulladder( sum, c_out, x, y, c_in ); output sum, c_out; input x, y, c_in; wire a, b, c; xor( a, x, y); xor( sum, a, c_in ); and( b, x, y ); and( c, a, c_in ); or( c_out, c, b ); endmodule Repetition • // for loop for(i = 0; i < 10; i = i + 1) begin $display(“i = %d", i); end • • //while loop i = 0; while(i < 10) begin $display(“i = %d", i); i = i + 1; end // repeat loop repeat (5) //repeats the block 5 times, begin $display(“i = %d", i); i = i + 1; end Blocking and Non-blocking Procedural Assignments • The blocking assignment statement (= operator) acts much like in traditional programming languages. Blocking statement must complete execute before the next statement in the behavior can execute. • The non-blocking (<= operator) evaluates all the right-hand sides for the current time unit and assigns the left-hand sides at the end of the time unit. Non-blocking assignment statements execute concurrently rather than sequentially. References – Cadence Design Systems, Inc., Verilog-XL Reference Manual. – Ciletti, Michael D., Starting Guides to Verilog 2001, Prentice Hall 2004 – http://www.eg.bucknell.edu/~cs320/Fall2003/veri log.html – http://www.verilog.net/index.html – http://www.eecs.berkeley.edu/~culler – http://www-inst.eecs.berkeley.edu/~cs150