V ERILOG

11
VERILOG 2. Μια πιο κοντινή ματιά

description

V ERILOG. 2. Μια πιο κοντινή ματιά. !. t 0 + period. t 0. Δομή της γλώσσας. `timescale 1ns / 1ns `define dh 2 `include “cwaves.h”. Μοιάζει πολύ με τη C Preprocessor Keywords Τελεστές Γλώσσα « event driven ». = ==, != , = && || ? :. & and | or ~ not ^ xor. - PowerPoint PPT Presentation

Transcript of V ERILOG

Page 1: V ERILOG

VERILOG

2. Μια πιο κοντινή ματιά

Page 2: V ERILOG

Verilog - Λυμπέρης Σπύρος 2

Δομή της γλώσσας

• Μοιάζει πολύ με τη C– Preprocessor– Keywords– Τελεστές

• Γλώσσα «event driven»

`timescale 1ns / 1ns`define dh 2`include “cwaves.h”

`timescale 1ns / 1ns`define dh 2`include “cwaves.h”

& and| or~ not^ xor

& and| or~ not^ xor

===, !=<, >, <=, >=&& ||? :

===, !=<, >, <=, >=&& ||? :

always clk = #(`period / 2) ~clk;always @(posedge clk) a = b + 1;always @(posedge clk) b = c + 1;

always clk = #(`period / 2) ~clk;always @(posedge clk) a = b + 1;always @(posedge clk) b = c + 1;

t0 + period

t0!

Page 3: V ERILOG

Verilog - Λυμπέρης Σπύρος 3

Events

• Κάθε έκφραση συνδέεται με έναν αρχικό χρόνο

• Initial και always: εσωτερικά σειριακά

0 10 20 30 40 50

initial begin a = 0; b = 0; clk = 0;end

always clk = #10 ~clk;

wire comb = a + b;

always @(posedge clk) a = b + 1;always @(posedge clk) b = c + 1;always @(posedge clk) c = #5 c + 1;

initial begin a = 0; b = 0; clk = 0;end

always clk = #10 ~clk;

wire comb = a + b;

always @(posedge clk) a = b + 1;always @(posedge clk) b = c + 1;always @(posedge clk) c = #5 c + 1;

0

10, 30

10, 30

15, 35

10, 20, 30, 40, 50

10+, 30+

Page 4: V ERILOG

Verilog - Λυμπέρης Σπύρος 4

Case

• … το γνωστό case

• Μόνο με σταθερές εκφράσεις

• Δεν χρειάζεται break

• Καλός κώδικας:– Μοναδικό αριστερό

μέρος

always @(posedge clk) begin case (opcode) 8’h0A: dstreg = #`dh inreg0; 8’h22: begin dstreg = #`dh a + 1; if (a | (b ^ (~c))) dstreg = #`dh inreg1; end 8’hFF: dstreg = #`dh inreg2; default: dstreg = #`dh 8’h00; endcaseend

always @(posedge clk) begin case (opcode) 8’h0A: dstreg = #`dh inreg0; 8’h22: begin dstreg = #`dh a + 1; if (a | (b ^ (~c))) dstreg = #`dh inreg1; end 8’hFF: dstreg = #`dh inreg2; default: dstreg = #`dh 8’h00; endcaseend

Page 5: V ERILOG

Verilog - Λυμπέρης Σπύρος 5

Concatenation

• «Hardwired» πράξεις…

• … απαραίτητες σε μια HDL

wire [2:0] a;wire [4:0] b;

wire [7:0] c = {a, b};

wire [2:0] a;wire [4:0] b;

wire [7:0] c = {a, b};

3

58a

bc

wire [7:0] unsigned;wire [15:0] sign_extend = { (unsigned[7] ? 8’hFF : 8’h0), unsigned};

wire [7:0] unsigned;wire [15:0] sign_extend = { (unsigned[7] ? 8’hFF : 8’h0), unsigned};

Page 6: V ERILOG

Verilog - Λυμπέρης Σπύρος 6

Μνήμες

• Αναδρομικά:array of array

• Συνήθως non-synthesizable

• Ειδική αρχικοποίηση

wire [15:0] word_in;wire [15:0] word_out;wire [9:0] addr;reg [15:0] memory [1023:0];

always @(posedge clk) begin if (we) memory[addr] = word_in; else word_out = memory[addr];end

wire [15:0] word_in;wire [15:0] word_out;wire [9:0] addr;reg [15:0] memory [1023:0];

always @(posedge clk) begin if (we) memory[addr] = word_in; else word_out = memory[addr];end

always @(negedge reset_n) $readmemh(“memory.dat”, memory);

always @(negedge reset_n) $readmemh(“memory.dat”, memory);

Page 7: V ERILOG

Verilog - Λυμπέρης Σπύρος 7

Δύναμη σημάτων

• Προτεραιότητα:– Χ– 1 και 0– Ζ– … και άλλα

• Αρχικά όλα Χ• Προσοχή στην

αρχικοποίηση always @(posedge clk) if (reset) ... else ...

always @(posedge clk) if (reset) ... else ...

X 0 1 Z

X X X X X

0 X 0 X 0

1 X X 1 1

Z X 0 1 Z

X 0 1 Z

X X X X X

0 X 0 X 0

1 X X 1 1

Z X 0 1 Z

initial ...initial ...

Page 8: V ERILOG

Verilog - Λυμπέρης Σπύρος 8

Τρικατάστατοι οδηγητές

• Εκμετάλλευση της κατάστασης Ζ

module tristate(en, clk, data);input en, clk;inout [7:0] data;

wire [7:0] data = (en) ? data_out : 8’bz;

always @(posedge clk) begin if (!en) case (data) ...endmodule

module tristate(en, clk, data);input en, clk;inout [7:0] data;

wire [7:0] data = (en) ? data_out : 8’bz;

always @(posedge clk) begin if (!en) case (data) ...endmodule

• Χρήση του τύπου inout

wire [7:0] bus;

tristate tr0(en0, clk, bus);tristate tr1(en1, clk, bus);tristate tr2(en2, clk, bus);

wire [7:0] bus;

tristate tr0(en0, clk, bus);tristate tr1(en1, clk, bus);tristate tr2(en2, clk, bus);

Page 9: V ERILOG

Verilog - Λυμπέρης Σπύρος 9

Παραμετρικά modules

• Μπορούμε να έχουμε παραμέτρους σε ένα module

• Default μέγεθος

• … πολύ βολικό!

module RegLd(Q, D, load, clk);

parameter N = 8;input [N-1:0] Q;output [N-1:0] D;input load, Clk;

always @(posedge clk) if (load) Q = #`dh D;

endmodule

module RegLd(Q, D, load, clk);

parameter N = 8;input [N-1:0] Q;output [N-1:0] D;input load, Clk;

always @(posedge clk) if (load) Q = #`dh D;

endmodule

RegLd reg0(q0, d0, l, clk);

RegLd #16 reg1(q1, d1, l, clk);

RegLd reg2(q2, d2, l, clk);defparam reg2.N = 4;

RegLd reg0(q0, d0, l, clk);

RegLd #16 reg1(q1, d1, l, clk);

RegLd reg2(q2, d2, l, clk);defparam reg2.N = 4;

Page 10: V ERILOG

Verilog - Λυμπέρης Σπύρος 10

Sensitivity lists

• Λογικές εκφράσεις με or, and

• posedge και negedge– Ρολόγια

• Προσοχή στο hardware που θέλουμε να περιγράψουμε…

always @(posedge clk or negedge rst_) ...

always @(a or b or c) if (opcode == 32’h52A0234E) a = b ^ (~c);

always @(posedge a or posedge b) ...

always @(posedge clk or negedge rst_) ...

always @(a or b or c) if (opcode == 32’h52A0234E) a = b ^ (~c);

always @(posedge a or posedge b) ... !

Page 11: V ERILOG

Verilog - Λυμπέρης Σπύρος 11

Τέλος!

• Preprocessor – `define – `timescale– `include

• Concatenations– {a, b, c}

• Case– case … endcase– default

• Μνήμες– reg [15:0] rf [7:0];

• Tρικατάστατοι– wire a = (en) ? 1’b1 : 1’bz;

• Parameters– parameter N = 16;– Reg #8 r0(…);

• Sensitivity lists– always @(a or b);– always @(negedge rst_);