Verilog Lecture Gandhi Puvvada, USC always statements, Coding a Flip-Flop. blocking and non-blocking assignments. Copyright 2008 Gandhi Puvvada 1

Similar documents
Digital Integrated Circuits

Last Lecture. Talked about combinational logic always statements. e.g., module ex2(input logic a, b, c, output logic f); logic t; // internal signal

Recommended Design Techniques for ECE241 Project Franjo Plavec Department of Electrical and Computer Engineering University of Toronto

Writing Circuit Descriptions 8

ECE 2300 Digital Logic & Computer Organization. More Sequential Logic Verilog

FPGA Design Challenge :Techkriti 14 Digital Design using Verilog Part 1

Chapter 10. Counters (a short discussion)

N-input EX-NOR gate. N-output inverter. N-input NOR gate

Date Performed: Marks Obtained: /10. Group Members (ID):. Experiment # 11. Introduction to Verilog II Sequential Circuits

a, b sum module add32 sum vector bus sum[31:0] sum[0] sum[31]. sum[7:0] sum sum overflow module add32_carry assign

In this lecture, we will go beyond the basic Verilog syntax and examine how flipflops and other clocked circuits are specified.

Synthesizable Verilog

Digital Design with FPGAs. By Neeraj Kulkarni

Verilog for Synthesis Ing. Pullini Antonio

VHDL: RTL Synthesis Basics. 1 of 59

ECE 551: Digital System *

Verilog Behavioral Modeling

Verilog Fundamentals. Shubham Singh. Junior Undergrad. Electrical Engineering

Lecture #2: Verilog HDL

In this lecture, we will focus on two very important digital building blocks: counters which can either count events or keep time information, and

Verilog For Synthesis

Design of a Simple Pipeline (RTL Coding)

Modeling Sequential Circuits in Verilog

Digital Design Using Verilog EE Final Examination

Digital Circuit Design and Language. Datapath Design. Chang, Ik Joon Kyunghee University

Lecture 3. Behavioral Modeling Sequential Circuits. Registers Counters Finite State Machines

EECS150 - Digital Design Lecture 5 - Verilog Logic Synthesis

2 ( = 46 points) 30 min.

ECE 4514 Digital Design II. Spring Lecture 13: Logic Synthesis

Exp#8: Designing a Programmable Sequence Detector

An easy to read reference is:

Control and Datapath 8

Contents. Chapter 9 Datapaths Page 1 of 28

CAD for VLSI Design - I. Lecture 21 V. Kamakoti and Shankar Balachandran

CSE140L: Components and Design Techniques for Digital Systems Lab

Synthesis vs. Compilation Descriptions mapped to hardware Verilog design patterns for best synthesis. Spring 2007 Lec #8 -- HW Synthesis 1

Lecture 12 VHDL Synthesis

Register Transfer Level

DIGITAL SYSTEM DESIGN

Logic Synthesis. EECS150 - Digital Design Lecture 6 - Synthesis

EEL 4783: HDL in Digital System Design

CSE140L: Components and Design

Topics. Midterm Finish Chapter 7

Nonblocking Assignments in Verilog Synthesis; Coding Styles That Kill!

EECS150 - Digital Design Lecture 10 Logic Synthesis

ENEE245 Digital Circuits and Systems Lab Manual

Synthesis of Language Constructs. 5/10/04 & 5/13/04 Hardware Description Languages and Synthesis

Chapter 2 Using Hardware Description Language Verilog. Overview

ECE 4514 Digital Design II. Spring Lecture 15: FSM-based Control

Spring 2013 EE201L Instructor: Gandhi Puvvada. Time: 7:30-10:20AM SGM124 Total points: Perfect score: Open-Book Open-Notes Exam

Lecture 32: SystemVerilog

EECS150 - Digital Design Lecture 10 Logic Synthesis

- 1 of 18 - The Verilog Hardware Description Language - A Behavioural View Overview. The Behavioural Model

Lecture 2: Data Types, Modeling Combinational Logic in Verilog HDL. Variables and Logic Value Set. Data Types. Why use an HDL?

Techniques for Digital Systems Lab. Verilog HDL. Tajana Simunic Rosing. Source: Eric Crabill, Xilinx

CSE 591: Advanced Hardware Design and Verification (2012 Spring) LAB #0

Homework deadline extended to next friday

Blocking(=) vs Nonblocking (<=) Assignment. Lecture 3: Modeling Sequential Logic in Verilog HDL. Procedural assignments

271/471 Verilog Tutorial

Finite-State Machine (FSM) Design

Why Should I Learn This Language? VLSI HDL. Verilog-2

ENEE245 Digital Circuits and Systems Lab Manual

VERILOG: FLIP-FLOPS AND REGISTERS

Quick Introduction to SystemVerilog: Sequental Logic

Verilog Tutorial. Introduction. T. A.: Hsueh-Yi Lin. 2008/3/12 VLSI Digital Signal Processing 2

Chapter 5 Registers & Counters

ECEN 468 Advanced Logic Design

VLSI Design 13. Introduction to Verilog

EE 231 Fall EE 231 Homework 8 Due October 20, 2010

Mark Redekopp and Gandhi Puvvada, All rights reserved. EE 357 Unit 15. Single-Cycle CPU Datapath and Control

Modeling Synchronous Logic Circuits. Debdeep Mukhopadhyay IIT Madras

Introduction to Nexys 2 board - Detour Signal Lab

CS6710 Tool Suite. Verilog is the Key Tool

EECS150 - Digital Design Lecture 4 - Verilog Introduction. Outline

ECE 4514 Digital Design II. Spring Lecture 2: Hierarchical Design

Verilog for High Performance

Verilog Sequential Logic. Verilog for Synthesis Rev C (module 3 and 4)

Xilinx ASMBL Architecture

A Brief Introduction to Verilog Hardware Definition Language (HDL)

EECS150 - Digital Design Lecture 20 - Finite State Machines Revisited

EE178 Lecture Verilog FSM Examples. Eric Crabill SJSU / Xilinx Fall 2007

This Lecture. Some components (useful for the homework) Verilog HDL (will continue next lecture)

Synthesis of Combinational and Sequential Circuits with Verilog

Topics. Midterm Finish Chapter 7

Workshop on Digital Circuit Design in FPGA

ECE 4514 Digital Design II. Spring Lecture 20: Timing Analysis and Timed Simulation

VHDL 2 Combinational Logic Circuits. Reference: Roth/John Text: Chapter 2

Testbenches for Sequential Circuits... also, Components

L5: Simple Sequential Circuits and Verilog

EN164: Design of Computing Systems Lecture 06: Lab Foundations / Verilog 2

Digital Design with SystemVerilog

Asynchronous FIFO Design

University of Toronto Faculty of Applied Science and Engineering Edward S. Rogers Sr. Department of Electrical and Computer Engineering

Lab 7 (All Sections) Prelab: Introduction to Verilog

Using Programmable Logic and the PALCE22V10

ENGR 3410: Lab #1 MIPS 32-bit Register File

Nikhil Gupta. FPGA Challenge Takneek 2012

C A R L E T O N U N I V E R S I T Y. FINAL EXAMINATION April Duration: 3 Hours No. of Students: 108

Introduction to Verilog/System Verilog

structure syntax different levels of abstraction

Transcription:

EE201L and EE560 Verilog Lecture by Gandhi Puvvada, USC always statements, t t Coding a Flip-Flop Counters, Basics of Data Path, blocking and non-blocking assignments Copyright 2008 Gandhi Puvvada 1

always statement for clocked logic Flip-Flops, Counters, State Machines, Data Registers,... In short, any clocked logic Logic with no reset always @(posedge Clk) begin : NO_RESET // statements; Copyright 2008 Gandhi Puvvada 2

asynchronous reset always @(posedge Clk, posedge Reset) begin : ASYNC_R if (Reset) // statements; else // statements; synchronous reset always @(posedge Clk ) begin : SYNC_ R if (Reset) // statements; else // statements; Copyright 2008 Gandhi Puvvada 3

asynchronous reset always @(posedge Clk, negedge Reset) begin : ASYNC_R if (~Reset) // statements; else // statements; synchronous reset always @(posedge Clk ) begin : SYNC_ R if (~Reset) // statements; else // statements; Copyright 2008 Gandhi Puvvada 4

Flip-Flop coding Q_no_r = FF with no reset at all Q_async_r = FF with asynchronous reset Q_sync_r = FF with synchronous reset Q_no_r_de = FF with Data Enable but no reset at all (suitable for data registers) Q_async_r_de = FF with asynchronous reset with Data Enable Q_sync_r_de = FF with synchronous reset with Data Enable Q_bad_r = The BAD coding results in treating the RESET as a Data-enable control. Q_bad_r_made_good = BAD coding fixed! Copyright 2008 Gandhi Puvvada 5

Q_no_r = FF with no reset at all always @(posedge Clk) begin : FF_NO_R Q_no_r <= D; Copyright 2008 Gandhi Puvvada 6

Q_no_r = FF with no reset at all Copyright 2008 Gandhi Puvvada 7

RTL schematic Copyright 2008 Gandhi Puvvada 8

Q_async_r = FF with asynchronous reset always @(posedge Clk, posedge Reset) begin : FF_ ASYNC_ R if (Reset) Q_async_r <= 1'b0; else Q_async_r <= D; Copyright 2008 Gandhi Puvvada 9

Q_async_r = FF with asynchronous reset Copyright 2008 Gandhi Puvvada 10

Q_sync_r = FF with synchronous reset always @(posedge Clk) begin : FF_ SYNC_ R if (Reset) Q_sync_r <= 1'b0; else Q_sync_r <= D; Copyright 2008 Gandhi Puvvada 11

Q_no_r_de = FF with Data Enable but no reset at all (suitable for data registers) always @(posedge Clk) begin : FF_NO_R_DE if (de) Q_no_r_de <= D; Copyright 2008 Gandhi Puvvada 12

Q_async_r_de = FF with asynchronous reset with Data Enable always @(posedge Clk, posedge Reset) begin : FF_ASYNC_R_DE if (Reset) Q_async_r_de <= 1'b0; else if (de) Q_async_r_de <= D; Copyright 2008 Gandhi Puvvada 13

Q_async_r_de = FF with asynchronous reset with Data Enable Copyright 2008 Gandhi Puvvada 14

Q_sync_r_de = FF with synchronous reset with Data Enable always @(posedge Clk) begin : FF_SYNC_R_DE if (Reset) Q_sync_r_de <= 1'b0; else if (de) Q_sync_r_de <= D; Copyright 2008 Gandhi Puvvada 15

Q_bad_r = The BAD coding results in treating the RESET as a Data-enable control always @(posedge Clk, posedge Reset) begin : FF_BAD_R if (Reset) ; // nothing to do else Q_bad_r <= D; Copyright 2008 Gandhi Puvvada 16

Q_bad_r = The BAD coding results in treating the RESET as a Data-enable control Copyright 2008 Gandhi Puvvada 17

Q_bad_r = The BAD coding results in treating the RESET as a Data-enable control Copyright 2008 Gandhi Puvvada 18

Q_bad_r_made_good = BAD coding fixed! always @(posedge Clk, posedge Reset) begin : FF_BAD_R_MADE_GOOD if (Reset) Q_bad_r_made_good <= 1'bX ; // tell XST that you do not // care what happens during // the reset else Q_bad_r_made_good <= D; Copyright 2008 Gandhi Puvvada 19

Q_bad_r_made_good = BAD coding fixed! Copyright 2008 Gandhi Puvvada 20

Synchronous counter with CLR, LOAD, and EN controls Mo st Significant 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Mux 3 I00 I01 I02 Y0 I10 I11 I12 Y1 Y2 S EN Least Significant BA0 BA1 BA2 Mux I00 I01 I02 Y0 I10 I11 I12 Y1 Y2 S Register 2 Mux1 Q0* D Q Q0 I00 I01 Q1* Q1 I02 Y0 Y1 D Q 0 I10 Y2 I11 Q2* Q2 0 I12 S D Q LOAD CLR CLK Copyright 2008 Gandhi Puvvada 21

74LS163A Synchronous counter Copyright 2008 Gandhi Puvvada 22

Gradual development of counter 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Register Q0* Q0 D Q Q1* Q1 D Q Q2* Q2 D Q CLK I00 I01 I02 Mux3 Y0 Y1 Y2 I10 I11 I12 S EN BA0 BA1 BA2 Mux 2 I00 I01 I02 Y0 I10 I11 I12 Y1 Y2 S LOAD 0 Mux 1 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S CLR Copyright 2008 Gandhi Puvvada 23

Basic idea in datapath design in RTL: intercept and inject Free running counter i <= i + 1; 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Register Q0* Q0 D Q Q1* Q1 D Q Q2* Q2 D Q CLK I00 I01 I02 I10 I11 I12 Mux 3 Y0 Y1 Y2 S EN BA0 BA1 BA2 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 2 LOAD 0 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 1 CLR Copyright 2008 Gandhi Puvvada 24

Counter with CLR control if f(c (CLR) i <= 3 b000; else i <= i + 1; 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Register Q0* Q0 D Q Q1* Q1 D Q Q2* Q2 D Q CLK I00 I01 I02 I10 I11 I12 Mux 3 Y0 Y1 Y2 S EN BA0 BA1 BA2 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 2 LOAD 0 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 1 CLR Copyright 2008 Gandhi Puvvada 25

Counter with CLR and LOAD controls if (CLR) i <= 3 b000; else if (LOAD) i <= {BA2, BA1, BA0}; else i <= i + 1; 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Register Q0* Q0 D Q Q1* Q1 D Q Q2* Q2 D Q CLK I00 I01 I02 I10 I11 I12 Mux 3 Y0 Y1 Y2 S EN BA0 BA1 BA2 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 2 LOAD 0 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 1 CLR Copyright 2008 Gandhi Puvvada 26

Counter with CLR, LOAD, and EN controls if (CLR) i <= 3 b000; else if (LOAD) i <= {BA2, BA1, BA0}; else if (EN) i <= i + 1; 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Register Q0* Q0 D Q Q1* Q1 D Q Q2* Q2 D Q CLK I00 I01 I02 I10 I11 I12 Mux 3 Y0 Y1 Y2 S EN BA0 BA1 BA2 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 2 LOAD 0 I00 I01 I02 I10 I11 I12 Mux Y0 Y1 Y2 S 1 CLR Copyright 2008 Gandhi Puvvada 27

Counter with CLR, LOAD, and EN controls if (CLR) i <= 3 b000; else if (LOAD) i <= {BA2, BA1, BA0}; else if (EN) i<=i+1; i else i <= i; 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Register Q0* Q0 D Q Q1* D Q Q1 Q2* Q2 D Q CLK Mux3 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S EN BA0 BA1 BA2 Mux2 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S LOAD 0 Mux1 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S CLR Copyright 2008 Gandhi Puvvada 28

Is this CLR control a synchronous clear control or an asynchronous clear control? Mo st Significant 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Mux 3 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S EN Least Significant BA0 BA1 BA2 I10 I11 I12 Mux I00 I01 I02 Y0 Y1 Y2 S Register 2 Mux1 Q0* D Q Q0 I00 I01 Q1* Q1 I02 Y0 Y1 D Q 0 I10 Y2 I11 Q2* Q2 0 I12 S D Q LOAD CLR CLK Copyright 2008 Gandhi Puvvada 29

How do we describe this counter in Verilog HDL? Structurally emulating the gate-level logic schematic of 74LS163A? Behaviorally based on the MSI level function design diagram? Mo st Significant Least Significant Adder Regist er Mux3 Mux2 Mux1 Q0* Q0 A0 D Q A1 I00 I00 I00 A2 I01 I01 I01 Q1* Q1 I02 Y0 I02 Y0 I02 Y0 1 B0 Y1 Y1 Y1 D Q 0 B1 S0 I10 Y2 BA0 I10 Y2 0 I10 Y2 0 B2 S1 I11 BA1 I11 I11 S2 Q2* Q2 I12 S BA2 I12 S 0 I12 S D Q EN LOAD CLR CLK Copyright 2008 Gandhi Puvvada 30

Ok, we all agree -- behaviorally So, shall we describe three muxes and one incrementer and a register? Mo st Significant 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Mux 3 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S EN Least Significant BA0 BA1 BA2 I10 I11 I12 Mux I00 I01 I02 Y0 Y1 Y2 S Register 2 Mux1 Q0* D Q Q0 I00 I01 Q1* Q1 I02 Y0 Y1 D Q 0 I10 Y2 I11 Q2* Q2 0 I12 S D Q LOAD CLR CLK Copyright 2008 Gandhi Puvvada 31

No! 5 separate items and their interconnection is not quite readable! Mo st Significant 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Mux 3 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S EN Least Significant BA0 BA1 BA2 I10 I11 I12 Mux I00 I01 I02 Y0 Y1 Y2 S Register 2 Mux1 Q0* D Q Q0 I00 I01 Q1* Q1 I02 Y0 Y1 D Q 0 I10 Y2 I11 Q2* Q2 0 I12 S D Q LOAD CLR CLK Copyright 2008 Gandhi Puvvada 32

An if statement in a clocked always block! Mo st Significant 1 0 0 A0 A1 A2 B0 B1 B2 Adder S0 S1 S2 Mux 3 I00 I01 I02 Y0 Y1 I10 Y2 I11 I12 S EN Least Significant BA0 BA1 BA2 I10 I11 I12 Mux I00 I01 I02 Y0 Y1 Y2 S Register 2 Mux1 Q0* D Q Q0 I00 I01 Q1* Q1 I02 Y0 Y1 D Q 0 I10 Y2 I11 Q2* Q2 0 I12 S D Q LOAD CLR CLK Copyright 2008 Gandhi Puvvada 33

Closest code Q_sync_r_de = FF with synchronous reset with Data Enable always @(posedge Clk) begin : FF_SYNC_R_DE if (Reset) Q_sync_r_de <= 1'b0; else if (de) Q_sync_r_de <= D; Copyright 2008 Gandhi Puvvada 34

Coding of a counter with synchronous CLR, and synchronous LOAD, and EN always @(posedge CLK, posedge CLR) begin : COUNTER if (CLR) Count <= 3'b000; else if (LOAD) Count <= Load_input; else if (EN) Count <= Count +1; Copyright 2008 Gandhi Puvvada 35

Coding of a counter with asynchronous CLR, and synchronous LOAD, and EN always @(posedge CLK, posedge CLR) begin : COUNTER if (CLR) Count <= 3'b000; else if (LOAD) Count <= Load_input; else if (EN) Count <= Count +1; Copyright 2008 Gandhi Puvvada 36

blocking and non-blocking assignments in procedural blocks Copyright 2008 Gandhi Puvvada 37

blocking assignments Copyright 2008 Gandhi Puvvada 38

blocking assignments Copyright 2008 Gandhi Puvvada 39

blocking assignments Copyright 2008 Gandhi Puvvada 40

blocking assignments Copyright 2008 Gandhi Puvvada 41

non-blocking assignments Copyright 2008 Gandhi Puvvada 42

non-blocking assignments Copyright 2008 Gandhi Puvvada 43

non-blocking assignments Copyright 2008 Gandhi Puvvada 44

non-blocking assignments Copyright 2008 Gandhi Puvvada 45

blocking and non-blocking assignments in procedural blocks Copyright 2008 Gandhi Puvvada 46

Consider a RIGHT-SHIFT register. Copyright 2008 Gandhi Puvvada 47

RIGHT-SHIFT register Copyright 2008 Gandhi Puvvada 48

RIGHT-SHIFT register Copyright 2008 Gandhi Puvvada 49

RIGHT-SHIFT register Copyright 2008 Gandhi Puvvada 50

RIGHT-SHIFT register Copyright 2008 Gandhi Puvvada 51

Copyright 2008 Gandhi Puvvada 52

Copyright 2008 Gandhi Puvvada 53

Copyright 2008 Gandhi Puvvada 54

Copyright 2008 Gandhi Puvvada 55

Copyright 2008 Gandhi Puvvada 56

RIGHT-SHIFT register Copyright 2008 Gandhi Puvvada 57

RIGHT-SHIFT register Copyright 2008 Gandhi Puvvada 58

TIMING Design avoids race Copyright 2008 Gandhi Puvvada 59

TIMING Design avoids race Copyright 2008 Gandhi Puvvada 60

Static ti Timing i Designer (in synthesis and implementation tools) performs millions of these timing checks to ensure that there are no RACE conditions! Copyright 2008 Gandhi Puvvada 61

Static Timing Designer. But then, during initial behavioral simulation, we do not state any delays in our code! So, our ZERO delay coding will fail?!? Copyright 2008 Gandhi Puvvada 62

Yes, that is where the non-blocking assignments with delta-delay save the day! Copyright 2008 Gandhi Puvvada 63

RIGHT-SHIFT register QC <= QB; QB <= QA; QA <= Sin; QC = QB; QB = QA; QA = Sin; QA <= Sin; QB <= QA; QC <= QB; QA = Sin; QB = QA; QC = QB; Copyright 2008 Gandhi Puvvada 64

RIGHT-SHIFT register QC <= QB; QB <= QA; QA <= Sin; QC = QB; QB = QA; QA = Sin; QA <= Sin; QB <= QA; QC <= QB; QA = Sin; QB = QA; QC = QB; Copyright 2008 Gandhi Puvvada 65

RIGHT-SHIFT register QC <= QB; QB <= QA; QA <= Sin; QC = QB; QB = QA; QA = Sin; QA <= Sin; QB <= QA; QC <= QB; QA = Sin; QB = QA; QC = QB; Copyright 2008 Gandhi Puvvada 66

RIGHT-SHIFT register CIRCULAR-SHIFT register QC = QB; QB = QA; QA = Sin; QC = QB; QB = QA; QA = QC; QC <= QB; QB <= QA; QA <= QC; Does any of the two work? Copyright 2008 Gandhi Puvvada 67

CIRCULAR-SHIFT register QC = QB; QB = QA; QA = QC; QC = QB; QB = QA; QA = QC; QC <= QB; QB <= QA; QA <= QC; Does any of the two work? Copyright 2008 Gandhi Puvvada 68

Conclusion on non-blocking assignment usage: Use it for assigning to physical registers In any real system, there e are hundreds of registers s updating on the same clock tick. Each register (through its NSL) should decide what to do (what value to acquire) based on the current state t (before the next clock edge) of other registers (including itself). Hence, use non-blocking assignments to assign a value to a register so that the new value appears after delta-t and does not cause any race condition. Copyright 2008 Gandhi Puvvada 69

Then, when do we use blocking assignments? For intermediate variables, (and in combinational logic) Copyright 2008 Gandhi Puvvada 70

intermediate variables in multi-level l l combinational logic Example problem: Given four numbers P, Q, X, Y find the smallest value and output t it as R (the result). One can use the conditional select operator in the continuous assign statement or in a procedural assignment statement, but the if statement (in a procedural block) is much more readable. Copyright 2008 Gandhi Puvvada 71

intermediate variables in multi-level combinational logic Without intermediate ed variables ab //conditional select operator sel? True : false assign R_assign1 = ( ((P < Q)? P : Q ) < ((X < Y)? X : Y ) )? ((P < Q)? P : Q ) : ((X < Y)? X : Y ); Copyright 2008 Gandhi Puvvada 72

intermediate variables in multi-level combinational logic With wire type intermediate variables (Data Flow modeling) //conditional select operator sel? True : false assign small_pq_wire = (P < Q)? P : Q ; assign small_xy_wire = (X < Y)? X : Y ; assign R_assign2 = (small_pq_wire < small_xy_wire)? small_pq_wire : small_xy_wire ; Copyright 2008 Gandhi Puvvada 73

intermediate variables in multi-level combinational logic With reg type intermediate variables (behavioral modeling) always @* if (P < Q) small_pq_reg = P; begin : SMALL_ALWAYS else small_pq_reg = Q ; // local reg variables if (X < Y) reg [1:0] small_pq_reg; small_xy_reg = X; reg [1:0] small_xy_reg; else small_xy_reg = Y ; if (small_pq_reg < small_xy_reg) R_always = small_pq_reg; else R_always = small_xy_reg ; Copyright 2008 Gandhi Puvvada 74

Final (final, not intermediate) assignment in combinational logic can be either blocking or non-blocking. As a thumb rule, we can use blocking assignments uniformly for describing combinational logic. if (P < Q) small_pq_reg = P; else small_pq_reg = Q ; if (X < Y) small_xy_reg = X; else small_xy_reg = Y ; if (small_pq_reg < small_xy_reg) R_always = small_pq_reg; else R_always = small_xy_reg ; Copyright 2008 Gandhi Puvvada 75

blocking and non-blocking assignments in clocked always blocks For physical registers, use non-blocking assignments only to prevent race condition and to prevent discrepancy between simulation and synthesis For producing values to be registered, if you use intermediate variables, then use blocking assignments to produce them. Copyright 2008 Gandhi Puvvada 76

blocking and non-blocking assignments in clocked always blocks Copyright 2008 Gandhi Puvvada 77

blocking and non-blocking assignments in clocked always blocks always @ (posedge CLK) begin : NSL_SM_example D = D1 & D2; Q <= D; always @ (posedge CLK) begin : NSL_SM_example D <= D1 & D2; Q = D; Copyright 2008 Gandhi Puvvada 78

blocking and non-blocking assignments in clocked always blocks always @ (posedge CLK) begin : NSL_SM_example D = D1 & D2; always @ (posedge CLK) begin : NSL_SM_example D <= D1 & D2; Q <= D; Q = D; Some think that both are OK. Other clocked always blocks may have Q on the RHS. You do not want to cause RACE condition nor simulation synthesis discrepancy. Copyright 2008 Gandhi Puvvada 79

Golden rule: Every non-blocking assignment in a clocked processes will result in a physical register! always @ (posedge CLK) begin : NSL_SM_example D=D1&D2; D1 D2; Q <= D; always @ (posedge CLK) begin : NSL_SM_example _ D <= D1 & D2; Q <= D; Copyright 2008 Gandhi Puvvada 80

intermediate variables? Then, do not try to read them before you assign to them! Otherwise you get extra registers! always @ (posedge CLK) begin : NSL_SM_example D=D1&D2; D1 D2; Q <= D; always @ (posedge CLK) begin : NSL_SM_example Q <= D; D=D1&D2; D1 D2; Copyright 2008 Gandhi Puvvada 81

intermediate variables in a clocked block? Then, treat them as local and do not reference them from outside! always @ (posedge CLK) begin : NSL_SM_example D = D1 & D2; Q <= D; always @ (posedge CLK) begin : NSL_SM_example _ Q_inverted_D <= ~ D; Copyright 2008 Gandhi Puvvada 82

If you really wanted this hardware, then code it as.. always @ (posedge CLK) begin : NSL_SM_example always @ (posedge CLK) begin : NSL_SM_example D = D1 & D2; Q <= D; D = D1 & D2; DR <= D; Q<=D; always @ (posedge CLK) begin : NSL_SM_example Q_inverted_D <= ~ D; always a @ (posedge CLK) begin : NSL_SM_example Q_inverted_D <= ~ DR; Copyright 2008 Gandhi Puvvada 83

If you wanted this hardware, then code all NSL and both registers in one always block or code the NSL separately in a combinational block. always @ (posedge CLK) begin : NSL_SM_example D = D1 & D2; Q <= D; Q_inverted_D <= ~ D; assign D = D1 & D2; Separate NSL always @ (posedge CLK) begin : SM_example Q <= D; Q_inverted_D <= ~ D; Copyright 2008 Gandhi Puvvada 84

If D is an intermediate variable and you do not want anyone to access it by mistake, then restrict its visibility always @ (posedge CLK) begin : NSL_SM_example reg D; // local declaration D = D1 & D2; Q <= D; Copyright 2008 Gandhi Puvvada 85

Can you code all this in one always clocked block? Copyright 2008 Gandhi Puvvada 86

always ays @ (posedge CLK) C ) begin : SM_OFL_example Q1 <= D1; Q2 <= D2; EN <= Q1 & Q2; Copyright 2008 Gandhi Puvvada 87

always @ (posedge CLK) begin : SM_OFL_example Q1 <= D1; Q2 <= D2; EN <= Q1 & Q2; Any object (such as EN here) assigned in the clocked always block, irrespective of whether it is assigned using a blocking assignment operator or non-blocking assignment operator, will result in a physical register, if it is referenced from outside of that block. If it is not referenced (referenced = read, placed on the RHS) from outside or inside, the synthesis or the implementation tool will treat it as a waste and will remove it. Copyright 2008 Gandhi Puvvada 88

What hardware is inferred by this? always @ (posedge CLK) begin : SM_ OFL_ example Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; if (EN) Q3 <= D3; Copyright 2008 Gandhi Puvvada 89

always @ (posedge CLK) begin : SM_ OFL_ example Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; if (EN) Q3 <= D3; hardware inferred Copyright 2008 Gandhi Puvvada 90

which of the two codes infers the hardware below? always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; always @ (posedge CLK) begin : SM_OFL_example_1B EN = Q1 & Q2; if (EN) Q3 <= D3; always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; always @ (posedge CLK) begin : SM_OFL_example_1B if (EN) Q3 <= D3; Copyright 2008 Gandhi Puvvada 91

which of the two codes infers the hardware below? always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; always @ (posedge CLK) begin : SM_OFL_example_1B EN = Q1 & Q2; if (EN) Q3 <= D3; always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; always @ (posedge CLK) begin : SM_OFL_example_1B if (EN) Q3 <= D3; Copyright 2008 Gandhi Puvvada 92

Then what hardware is inferred by this code? always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; always @ (posedge CLK) begin : SM_OFL_example_1B if (EN) Q3 <= D3; Copyright 2008 Gandhi Puvvada 93

Then what hardware is inferred by this code? registered EN Note that, so far as the hardware inferred or the simulation behavior exhibited, it does not matter whether we used blocking or non-blocking assignment operator here. Both simulation and synthesis tool designers treat the EN referred to in the bottom clocked always block as a registered EN. The tool designers interpret an inappropriate (but syntactically correct) blocking assignment to EN (which is conveyed to another always block) as a nonblocking assignment and proceed with simulation or synthesis. So the two concerns ( discrepancy between simulation and synthesis and creation of race condition elsewhere ) expressed in slides 66/102, 67/102, 76/102, 79/102 are not real concerns, however, we still need to follow the coding recommations as a good engineering practice. always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; // inappropriate = always @ (posedge CLK) begin : SM_OFL_example_1B if (EN) Q3 <= D3; EN from the top clocked block is referred to here Copyright 2008 Gandhi Puvvada 94

What if the 2 nd always block is combinational? always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; always @ (EN) begin : SM_OFL_example_1B EN_bar <= ~ EN; Copyright 2008 Gandhi Puvvada 95

What if the 2 nd always block is combinational? always @ (posedge CLK) begin : SM_OFL_example_1A Q1 <= D1; Q2 <= D2; EN = Q1 & Q2; always @ (EN) begin : SM_OFL_example_1B EN_bar <= ~ EN; Copyright 2008 Gandhi Puvvada 96

NS SL SM O FL Generalization: Any upstream logic to a register can be called a NSL! Increme enter Reg Subtrac cter X-Re eg Copyright 2008 Gandhi Puvvada 97

NSL SM OFL NS SL SNSL, SM, OFL SM FL O SM goes in a clocked always block. Its NSL (the SM s NSL) can be coded along with the SM in the same clocked always block. However, the OFL outputs are purely combinational and should not be coded along with the SM in the clocked always block. OFL should be coded separately in a combinational block (or produced using assign statements). Or if the OFL is feeding into another NSL of another SM, then it can be combined in the coding of that SM under that clocked always block. Copyright 2008 Gandhi Puvvada 98

Division between DPU and CU Traditional division between DPU and CU OFL (combinational logic) is in the CU. DPU Division between DPU and CU for HDL coding OFL (combinational logic) is moved to DPU. It is NOT coded explicitly. The OFL is implicit in the DPU s RTL in the CASE statement. DPU X_Reg Y_Reg X_Reg Y_Reg OFL OFL NSL SM Current_State CU SM NSL Current_State CU Copyright 2008 Gandhi Puvvada 99

Counter coding Simple, all non-blocking assignments always @(posedge CLK, posedge CLR) begin : COUNTER if (CLR) Count <= 3'b000; else if (LOAD) Count <= Load_ input; else if (EN) Count <= Count +1; Copyright 2008 Gandhi Puvvada 100

Counter coding need for a mix of blocking and non-blocking assignments This is a made-up problem. It is a 5-bit truncated UP counter going from 0 to 20 and back to zero. When the JUMP is asserted, the counter should jump to the mid-point M or a little beyond the midpoint M as detailed below. The midpoint M is the middle point between ee the current count and 20. Example: Say, the current count is 12. Distance from 20 is 8. Half is 4. So the mid point M is at 16 (12+4 = 16). But what if the difference is an ODD number? Then you need to jump by either the "floor" or the "ceiling" of the half of the difference deping on whether the difference is less than ten or more than ten respectively. We said, "or a little beyond the mid point M". After calculating the mid point M, a bonus to the jump by a constant of 4 is allowed if this bonus addition does not cause wrapping around (due to going g beyond 20). Examples: So, for the current count of 12, the jump takes you to 20, but, for the current count of 14, the jump takes you only to 17. Copyright 2008 Gandhi Puvvada 101

if (jump) begin Q_next = Q; // notice blocking assignment diff = 20 - Q_next; // (20 - Q) also works if (diff[0] == 0) // if the difference is even begin Q_next = Q_next + { 1'b0, diff[4:1] }; else begin if (diff < 10) begin Q_next = Q_next + { 1'b0, diff[4:1] }; else begin Q_next = Q_next + { 1'b0, diff[4:1] } + 1'b1; if ( (20 - Q_next) >= 4) begin Q_next = Q_next + 4; // bonus 4 Q <= Q_next; // notice the non-blocking assignment Copyright 2008 Gandhi Puvvada 102