[PPT]MIPS Assembly Language - TAMU Computer Science...

Preview:

Citation preview

First Steps in Verilog

CPSC 321 Computer Architecture

Andreas Klappenecker

Verilog Simulators vcs from Synopsis

powerful debugging tools Icarus Verilog

compiler, free Veriwell

simulator, free

Information about Verilog Short manual

by Chauhan and Blair Verilog Quick Reference Guide by Sutherland HDL Appendix A in Fundamentals of Digital

Logic by Brown and Vranesic Quick Reference for Verilog HDL by Rajeev Madhavan

Hello Worldmodule top;

initial $display("Hello, world!");endmodule

initial statements are executed once by the simulator

Verilog Simulator The Verilog simulator is event

driven Different styles of Verilog

structural dataflow behavioral

We will see examples of each type

Nets A net represents a node in the circuit The wire type connects an

output of one element to an input of another element

wire abar; not(abar, a); nand(b, abar,abar);

Vector wires Range [msb: lsb] wire [3:0] S; S = 4’b0011 The result of this assignment is S[3] = 0, S[2] = 0, S[1] = 1, S[0] = 1 wire [1:2] A;A = S[2:1];

means A[1] = S[2], A[2] = S[1]

Variables Variables come in two flavors

reg integers

reg can model combinatorial or sequential parts of the circuits

reg does not necessarily denote a register! Integers often used as loop control

variables useful for describing the behavior of a module

Simple Examplemodule testgate; reg b, c; // variables wire a, d, e; // nets and (d, b, c); // gates or (e, d, c); // nand(a, e, b); // initial begin // simulated once b=1; c=0; // blocking assignments #10 $display("a = %b", a); end

endmodule What value will be printed?

Operators 1’s complement ~A 2’s complement -A bitwise AND A&B reduction &A produces AND of all bits in A Concatenate {a,b,c} | {a,b,c} = a | b | c Replication operators 2{A} = {A,A}

{2{A},3{B}} = {A,A,B,B,B}

Continuous assignments Single bit assignments assign s = x ^ y ^ cin; assign cout = (x & y) | (cin & x) | (cin &y )

Multibit assignments wire [1:3] a,b,c; … assign c = a & b;

Full Addermodule fulladd(cin, x, y, s, cout) input cin, x, y; output s, cout; assign s = x ^ y ^ cin; assign cout = (x & y) | (cin & x) | (cin

& y); endmodule

Always Blocks An always block contains one or

more procedural statements always @(sensitivity list) always @(x or y) begin s = x ^ y; c = x & y; end

Mux: Structural Verilogmodule mux(f, a,b,sel);

input a,b,sel;

output f;

wire f1, f2;

not(nsel, sel);

and(f1, a,nsel);

and(f2, b, sel);

or (f, f1, f2);

endmodule

ba

sel

f

Mux: Dataflow Modelmodule mux2(f, a,b,sel);output f;input a,b,sel;

assign f = (a & ~sel) | (b & sel);endmodule

Mux: Behavioral Modelmodule mux2(f, a,b,sel);

output f;input a,b,sel;reg f;

always @(a or b or sel) if (sel==1)

f = b;else

f = a;endmodule

Sign extension and additionmodule adder_sign(x,y,s,s2s); input [3:0] x,y; output [7:0] s, ss; assign s = x + y, ss = {{4{x[3]}},x}+{{4{y[3]},y}endmodulex = 0011, y = 1101s = 0011 + 1101 = 00010000ss = 0011 + 1101 = 00000011 + 11111101= = 00000000

Demux Example2-to-4 demultiplexer with active lowenable a b z[3

]z[2]

z[1]

z[0]

0 x x 1 1 1 11 0 0 1 1 1 01 1 0 1 1 0 11 0 1 1 0 1 11 1 1 0 1 1 1

Demux: Structural Model// 2-to-4 demultiplexer with active-low outputs module demux1(z,a,b,enable); input a,b,enable; output [3:0] z;

wire abar,bbar; // local signals

not v0(abar,a), v1(bbar,b); nand n0(z[0],enable,abar,bbar); nand n1(z[1],enable,a,bbar); nand n2(z[2],enable,abar,b); nand n3(z[3],enable,a,b); endmodule

Demux: Dataflow model// 2-to-4 demux with active-low outputs // dataflow model module demux2(z,a,b,enable); input a,b,enable; output [3:0] z; assign z[0] = | {~enable,a,b}; assign z[1] = ~(enable & a & ~b); assign z[2] = ~(enable & ~a & b); assign z[3] = enable ? ~(a & b) : 1'b1;endmodule

Demux: Behavioral Model// 2-to-4 demultiplexer with active-low outputs module demux3(z,a,b,enable); input a,b,enable; output [3:0] z; reg z; // not really a register! always @(a or b or enable) case ({enable,a,b}) default: z = 4'b1111; 3'b100: z = 4'b1110; 3'b110: z = 4'b1101; 3'b101: z = 4'b1011; 3'b111: z = 4'b0111; endcase endmodule

Recommended