verilog tutorial part deux
play

Verilog Tutorial, Part Deux By Sat Garcia 1 Complete the quote - PowerPoint PPT Presentation

Verilog Tutorial, Part Deux By Sat Garcia 1 Complete the quote Good artists __________ . copy Great artists __________. steal - Pablo Picasso The following slides are only slightly modified from those in the MIT 6.375 course


  1. Verilog Tutorial, Part Deux By Sat Garcia 1

  2. Complete the quote  “Good artists __________ . copy Great artists __________.” steal - Pablo Picasso  The following slides are only slightly modified from those in the MIT 6.375 course  http://csg.csail.mit.edu/6.375/ 2

  3. Designing a GCD Calculator  Euclid’s Algorithm for GCD (in C): int GCD( int inA, int inB) { int done = 0; int A = inA; int B = inB; while ( !done ) { How do we implement if ( A < B ) // if A < B, swap values { this in hardware? swap = A; A = B; B = swap; } else if ( B != 0 ) // subtract as long as B isn’t 0 A = A - B; else done = 1; } return A; 3 Adapted from Arvind and Asanovic's MIT 6.375 lecture }

  4. Take 1: Behavioral Verilog module gcdGCDUnit_behav#( parameter W = 16 ) // parameterize for better reuse ( input [W-1:0] inA, inB, output [W-1:0] out ); reg [W-1:0] A, B, out, swap; integer done; always @(*) begin What’s wrong with this approach? done = 0; A = inA; B = inB; Doesn’t synthesize! (notice that while ( !done ) begin data dependent loop?) if ( A < B ) swap = A; A = B; B = swap; else if ( B != 0 ) A = A - B; else done = 1; end out = A; end 4 Adapted from Arvind and Asanovic's MIT 6.375 lecture endmodule

  5. Making the code synthesizable  Start with behavioral and find out what hardware constructs you’ll need  Registers (for state)  Functional units  Adders / Subtractors  Comparators  ALU’s 5

  6. Identify the HW structures module gcdGCDUnit_behav#( parameter W = 16 ) ( input [W-1:0] inA, inB, output [W-1:0] out ); reg [W-1:0] A, B, out, swap; integer done; State → Registers always @(*) begin done = 0; A = inA; B = inB; Less than comparator while ( !done ) begin if ( A < B ) swap = A; Equality Comparator A = B; B = swap; else if ( B != 0 ) Subtractor A = A - B; else done = 1; end out = A; end 6 Adapted from Arvind and Asanovic's MIT 6.375 lecture endmodule

  7. Next step: define module ports input_available result_rdy result_taken operands_bits_A result_bits_data operands_bits_B clk reset 7 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  8. Implementing the modules  Two step process: 1. Define datapath 2. Define control/control path Control in/outputs Control Control in/outputs Data output Data inputs Datapath 8 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  9. Developing the datapath Also need a couple MUXs zero? lt A = inA; B = inB; A while ( !done ) sub begin if ( A < B ) swap = A; A = B; B B = swap; else if ( B != 0 ) A = A - B; else done = 1; end Y = A; 9 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  10. Adding control A A B B mux reg mux reg sel en sel en B = 0 A < B zero? lt A = inA; B = inB; A while ( !done ) sub begin if ( A < B ) swap = A; A = B; B B = swap; else if ( B != 0 ) A = A - B; else done = 1; end Y = A; 10 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  11. Datapath module module gcdDatapath#( parameter W = 16 ) ( input clk, A A B B B = 0 A < B sel en sel en // Data signals input [W-1:0] operands_bits_A, zero? lt input [W-1:0] operands_bits_B, output [W-1:0] result_bits_data, A sub // Control signals (ctrl->dpath) B input A_en, input B_en, input [1:0] A_mux_sel, input B_mux_sel, // Control signals (dpath->ctrl) output B_zero, output A_lt_B ); 11 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  12. Implementing datapath module wire [W-1:0] B; wire [W-1:0] B_mux_out; wire [W-1:0] sub_out; 2inMUX#(W) B_mux wire [W-1:0] A_mux_out; ( .in0 (operands_bits_B), 3inMUX#(W) A_mux .in1 (A), ( .sel (B_mux_sel), .in0 (operands_bits_A), .out (B_mux_out) .in1 (B), ); Remember: .in2 (sub_out), ED_FF#(W) B_ff Functionality only in .sel (A_mux_sel), ( .out (A_mux_out) .clk (clk), “leaf” modules! ); .en_p (B_en), .d_p (B_mux_out), wire [W-1:0] A; .q_np (B) ); ED_FF#(W) A_ff // D flip flop ( // with enable 2inEQ#(W) B_EQ_0 .clk (clk), ( .in0(B),in1(W'd0),.out(B_zero) ); .en_p (A_en), LessThan#(W) lt .d_p (A_mux_out), ( .in0(A),.in0(B), .out(A_lt_B) ); .q_np (A) Subtractor#(W) sub ); (.in0(A),in1(B),.out(sub_out) ); assign result_bits_data = A; 12 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  13. State machine for control reset Wait for new inputs WAIT input_availble Swapping and subtracting CALC ( B = 0 ) Wait for result to be grabbed DONE result_taken 13 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  14. Implementing control module module gcdControlUnit ( A A B B B = 0 A < B sel en sel en input clk, input reset, zero? lt // Data signals A input input_available, sub input result_rdy, output result_taken, B // Control signals (ctrl->dpath) output A_en, output B_en, output [1:0] A_mux_sel, Remember: Keep next output B_mux_sel, state (combin.), state // Control signals (dpath->ctrl) input B_zero, update (seq.), and input A_lt_B output logic separated! ); 14 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  15. State update logic  Remember: keep state update, next state calculation, and output logic separated localparam WAIT = 2'd0; // local params are scoped constants localparam CALC = 2'd1; localparam DONE = 2'd2; reg [1:0] state_next; wire [1:0] state; RD_FF state_ff // flip flop with reset ( .clk (clk), .reset_p (reset), .d_p (state_next), .q_np (state) ); 15 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  16. Output signals logic reg [6:0] cs; WAIT : begin always @(*) A_mux_sel = A_MUX_SEL_IN; begin A_en = 1'b1; B_mux_sel = B_MUX_SEL_IN; // Default control signals B_en = 1'b1; A_mux_sel = A_MUX_SEL_X; input_available = 1'b1; A_en = 1'b0; end B_mux_sel = B_MUX_SEL_X; B_en = 1'b0; CALC : input_available = 1'b0; if ( A_lt_B ) result_rdy = 1'b0; A_mux_sel = A_MUX_SEL_B; A_en = 1'b1; case ( state ) B_mux_sel = B_MUX_SEL_A; B_en = 1'b1; WAIT : else if ( !B_zero ) ... A_mux_sel = A_MUX_SEL_SUB; CALC : A_en = 1'b1; ... end DONE : ... DONE : endcase result_rdy = 1'b1; end 16 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  17. Next state logic always @(*) reset begin WAIT // Default is to stay in the same state state_next = state; input_availble case ( state ) WAIT : CALC if ( input_available ) state_next = CALC; ( B = 0 ) CALC : if ( B_zero ) state_next = DONE; DONE result_taken DONE : if ( result_taken ) state_next = WAIT; endcase end 17 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  18. Next step: define module ports input_available result_rdy result_taken operands_bits_A result_bits_data operands_bits_B clk reset 18 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  19. Wire them together module gcd#( parameter W = 16 ) A A B B B = 0 A < B sel en sel en ( input clk, zero? lt A // Data signals sub input [W-1:0] operands_bits_A, input [W-1:0] operands_bits_B, B output [W-1:0] result_bits_data, // Control signals input input_available, input reset, gcdDatapath#(16) datapath ( output result_rdy, .operand_bits_A(operands_bits_A), input result_taken … .A_mux_sel(A_sel), … ); ) wire[1:0] A_sel; gcdControl#(16) control ( wire A_en; .A_sel(A_sel), … … ) 19 Adapted from Arvind and Asanovic's MIT 6.375 lecture

  20. Wire them together module gcd#( parameter W = 16 ) ( input clk, // Data signals input [W-1:0] operands_bits_A, input [W-1:0] operands_bits_B, output [W-1:0] result_bits_data, // Control signals input input_available, input reset, output result_rdy, input result_taken );

  21. But wait, there’s more  Build test bench a la lab 1  Test thoroughly, debug  Measure cycle time, optimize, etc.

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend