V ERILOG 2. Μια πιο κοντινή ματιά
ΗΥ Παπαευσταθίου Γιάννης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; clk) a = b + 1; clk) b = c + 1; always clk = #(`period / 2) ~clk; clk) a = b + 1; clk) b = c + 1; t 0 + period t0t0 !
ΗΥ Παπαευσταθίου Γιάννης3 Events Κάθε έκφραση συνδέεται με έναν αρχικό χρόνο Initial και always: εσωτερικά σειριακά initial begin a = 0; b = 0; clk = 0; end always clk = #10 ~clk; wire comb = a + b; clk) a = b + 1; clk) b = c + 1; clk) c = #5 c + 1; initial begin a = 0; b = 0; clk = 0; end always clk = #10 ~clk; wire comb = a + b; clk) a = b + 1; clk) b = c + 1; clk) c = #5 c + 1; 0 10, 30 15, 35 10, 20, 30, 40, , 30 +
ΗΥ Παπαευσταθίου Γιάννης4 Case … το γνωστό case Μόνο με σταθερές εκφράσεις Δεν χρειάζεται break Καλός κώδικας: –Μοναδικό αριστερό μέρος 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; endcase end 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; endcase end
ΗΥ Παπαευσταθίου Γιάννης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}; a b c 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 };
ΗΥ Παπαευσταθίου Γιάννης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]; 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]; clk) begin if (we) memory[addr] = word_in; else word_out = memory[addr]; end reset_n) $readmemh(“memory.dat”, memory); reset_n) $readmemh(“memory.dat”, memory);
ΗΥ Παπαευσταθίου Γιάννης7 Δύναμη σημάτων Προτεραιότητα: –Χ –1 και 0 – Ζ –… και άλλα Αρχικά όλα Χ Προσοχή στην αρχικοποίηση clk) if (reset)... else... clk) if (reset)... else... initial...
ΗΥ Παπαευσταθίου Γιάννης8 Τρικατάστατοι οδηγητές Εκμετάλλευση της κατάστασης Ζ module tristate(en, clk, data); input en, clk; inout [7:0] data; wire [7:0] data = (en) ? data_out : 8’bz; 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; 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);
ΗΥ Παπαευσταθίου Γιάννης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; 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; 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;
ΗΥ Παπαευσταθίου Γιάννης10 Sensitivity lists Λογικές εκφράσεις με or, and posedge και negedge –Ρολόγια Προσοχή στο hardware που θέλουμε να περιγράψουμε… clk or negedge rst_)... or b or c) if (opcode == 32’h52A0234E) a = b ^ (~c); a or posedge b)... clk or negedge rst_)... or b or c) if (opcode == 32’h52A0234E) a = b ^ (~c); a or posedge b)... !
ΗΥ Παπαευσταθίου Γιάννης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 or b); rst_);