HDL Coding Style Xilinx, Inc. All Rights Reserved

Similar documents
Topics. Midterm Finish Chapter 7

Topics. Midterm Finish Chapter 7

Basic FPGA Architecture Xilinx, Inc. All Rights Reserved

Xilinx ASMBL Architecture

CSE140L: Components and Design

EEL 4783: HDL in Digital System Design

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

CDA 4253 FPGA System Design Op7miza7on Techniques. Hao Zheng Comp S ci & Eng Univ of South Florida

CSE140L: Components and Design Techniques for Digital Systems Lab

Verilog for High Performance

Logic Synthesis. EECS150 - Digital Design Lecture 6 - Synthesis

Field Programmable Gate Array (FPGA)

EECS150 - Digital Design Lecture 10 Logic Synthesis

Lecture 12 VHDL Synthesis

EECS150 - Digital Design Lecture 10 Logic Synthesis

The Virtex FPGA and Introduction to design techniques

Field Programmable Gate Array

TSEA44 - Design for FPGAs

ECE 699: Lecture 9. Programmable Logic Memories

LeonardoSpectrum & Quartus II Design Methodology

Virtex-II Architecture

VHDL for Synthesis. Course Description. Course Duration. Goals

FSM Components. FSM Description. HDL Coding Methods. Chapter 7: HDL Coding Techniques

Programmable Logic. Simple Programmable Logic Devices

ECE 545: Lecture 11. Programmable Logic Memories

ECE 545: Lecture 11. Programmable Logic Memories. Recommended reading. Memory Types. Memory Types. Memory Types specific to Xilinx FPGAs

VHDL And Synthesis Review

ECE 545 Lecture 12. FPGA Resources. George Mason University

Control and Datapath 8

Verilog for Synthesis Ing. Pullini Antonio

Spartan-3 Libraries Guide for HDL Designs. UG607 (v 13.3) October 26, 2011

PINE TRAINING ACADEMY

CprE 583 Reconfigurable Computing

EECS150 - Digital Design Lecture 5 - Verilog Logic Synthesis

VHDL: Modeling RAM and Register Files. Textbook Chapters: 6.6.1, 8.7, 8.8, 9.5.2, 11.2

Block RAM. Size. Ports. Virtex-4 and older: 18Kb Virtex-5 and newer: 36Kb, can function as two 18Kb blocks

EECS150 - Digital Design Lecture 16 - Memory

EE178 Lecture Module 2. Eric Crabill SJSU / Xilinx Fall 2007

Abi Farsoni, Department of Nuclear Engineering and Radiation Health Physics, Oregon State University

Hardware Description Language VHDL (1) Introduction

Today. Comments about assignment Max 1/T (skew = 0) Max clock skew? Comments about assignment 3 ASICs and Programmable logic Others courses

קורס VHDL for High Performance. VHDL

Verilog introduction. Embedded and Ambient Systems Lab

EECS150 - Digital Design Lecture 16 Memory 1

CPE 626 Advanced VLSI Design Lecture 6: VHDL Synthesis. Register File: An Example. Register File: An Example (cont d) Aleksandar Milenkovic

Synthesis Options FPGA and ASIC Technology Comparison - 1

XST User Guide

FPGA architecture and design technology

Spartan-3 Libraries Guide for HDL Designs ISE 10.1

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

XST User Guide. UG627 (v 11.3) September 16, 2009

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

Virtex-II Architecture. Virtex II technical, Design Solutions. Active Interconnect Technology (continued)

CPE 626 Advanced VLSI Design Lecture 7: VHDL Synthesis

Design Problem 5 Solution

Timing in synchronous systems

Timing Closure 6.1i. By: Rhett Whatcott

FPGA Architecture Overview. Generic FPGA Architecture (1) FPGA Architecture

ECE 448 Lecture 13. FPGA Memories. George Mason University

Memory and Programmable Logic

EECS 151/251A Spring 2019 Digital Design and Integrated Circuits. Instructor: John Wawrzynek. Lecture 18 EE141

Digital Design (VIMIAA01) Introduction to the Verilog HDL

Advanced High-level HDL Design Techniques for Programmable Logic

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

Readings: Storage unit. Can hold an n-bit value Composed of a group of n flip-flops. Each flip-flop stores 1 bit of information.

8 Register, Multiplexer and

7-Series Architecture Overview

Product Obsolete/Under Obsolescence

Lecture 11 Memories in Xilinx FPGAs

IDEA! Avnet SpeedWay Design Workshop

Digital Design with SystemVerilog

LogiCORE IP Initiator/Target v5 and v6 for PCI-X

CCE 3202 Advanced Digital System Design

VHDL: RTL Synthesis Basics. 1 of 59

Designing Safe Verilog State Machines with Synplify

[VARIABLE declaration] BEGIN. sequential statements

Introduction to Field Programmable Gate Arrays

The VHDL Hardware Description Language

Spartan-3E Libraries Guide for HDL Designs. UG617 (v 14.5) March 20, 2013

FPGA Lecture for LUPO and GTO Vol , 31 August (revised 2013, 19 November) H. Baba

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

Advanced Synthesis Techniques

Lab 3 Sequential Logic for Synthesis. FPGA Design Flow.

EE 459/500 HDL Based Digital Design with Programmable Logic. Lecture 15 Memories

Virtex-4 Libraries Guide for HDL Designs. UG619 (v 12.4) December 14, 2010

3 Designing Digital Systems with Algorithmic State Machine Charts

Synthesis of Combinational and Sequential Circuits with Verilog

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

Hardware Design with VHDL Design Example: BRAM ECE 443

MCMASTER UNIVERSITY EMBEDDED SYSTEMS

Design Problem 4 Solution

Luleå University of Technology Kurskod SMD098 Datum Skrivtid

Contents. Chapter 9 Datapaths Page 1 of 28

Implementing Multipliers in Xilinx Virtex II FPGAs

FPGA for Software Engineers

VHDL HIERARCHICAL MODELING

EECS150 - Digital Design Lecture 13 - Project Description, Part 2: Memory Blocks. Project Overview

Writing Circuit Descriptions 8

INTRODUCTION TO FPGA ARCHITECTURE

EE260: Digital Design, Spring 2018

Transcription:

HDL Coding Style

Objective After completing this module, you will be able to: Select a proper coding style to create efficient FPGA designs Specify Xilinx resources that need to be instantiated for various FPGA synthesis tools HDL Coding Style - 5-3

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-4

Instantiation Versus Inference Instantiate a component when you must dictate exactly which resource is needed Synthesis tool is unable to infer the resource Synthesis tool fails to infer the resource Xilinx recommends inference whenever possible Inference makes your code more portable Synthesis tools cannot estimate timing delays through instantiated components Xilinx recommends the use of the CORE Generator System to create ALUs, fast multipliers, FIR Filters, etc. for instantiation HDL Coding Style - 5-5

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-6

Multiplexers Multiplexers are generated from IF and CASE statements IF/THEN statements generate priority encoders Use CASE to generate complex encoding There are several issues to consider with a multiplexer Delay and size Affected by the number of inputs and number of nested clauses to an IF/THEN or CASE statement Unintended latches or clock enables Generated when IF/THEN or CASE statements do not cover all conditions HDL Coding Style - 5-7

Avoid Nested IF and CASE Statements Nested IF or CASE statements infer cascaded logic More levels of logic lower performance When nested IFs are necessary, put critical input signals on the first (outer) IF statement The critical signal ends up in the last logic stage HDL Coding Style - 5-8

Unintended Latch Inference In IF/CASE statements, latches are inferred when: All possible input values are not covered All outputs are not defined in all branches When the IF/CASE statement is in a clocked process (VHDL) or always block (Verilog), latches are not inferred Clock enables are inferred instead This is not wrong, but it might generate a long clock-enable equation Use default assignments before the IF/CASE statement to prevent latches or inferred clock enables HDL Coding Style - 5-9

Clock Enables Coding style will determine if clock enables are used Reset and set have precedence over clock enable VHDL FF_AR_CE: process(enable,clk) begin if (CLK event and CLK = 1 ) then if (ENABLE = 1 ) then Q <= D_IN; end if; end if; end process Verilog always @(posedge CLOCK) if (ENABLE) Q = D_IN; HDL Coding Style - 5-10

State Machine Design Put the next-state logic in one CASE statement The state register may also be included here or in a separate process or always block Put the state machine outputs in a separate process or always block Easier for synthesis tools to optimize logic this way Inputs to FSM S1 S5 Next-state logic State register S2 State Machine Module S4 State machine outputs S3 HDL Code HDL Coding Style - 5-11

The Perfect State Machine The perfect state machine has Inputs: input signals, state jumps Outputs: output states, and control/enable signals to the rest of the design NO arithmetic logic, datapaths, or combinatorial functions inside the state machine Current State Feedback to Drive State Jumps Input Signals State Jumps Only! Next State State Register Output State and Enables HDL Coding Style - 5-12

State Machine Encoding Use enumerated types to define state vectors (VHDL) Most synthesis tools have commands to extract and re-encode state machines described in this way Use one-hot encoding for high-performance state machines Uses more registers, but simplifies next-state logic Experiment to discover how your synthesis tool chooses the default encoding scheme Register state machine outputs for higher performance HDL Coding Style - 5-13

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-14

Instantiation Tips Use instantiation only when it is necessary to access device features or increase performance or decrease area Exceptions are noted at the end of this section Limit the location of instantiated components to a few source files, to make it easier to locate these components when porting the code HDL Coding Style - 5-15

Virtex-II Resources Shift register LUT (SRL16 / SRLC16) F5, F6, F7, and F8 MUX Carry Logic MULT_AND Memories (distributed and block, RAM and ROM) MULT18x18 / MULT18x18S SelectI/O I/O Registers (Single or Double Data Rate) Global clock buffers (BUFG, BUFGDLL, BUFGCE, BUFGMUX) DCM STARTUP_VIRTEX2 HDL Coding Style - 5-16

Synopsys FPGA Compiler II Can be inferred: Shift register LUT (SRL16 / SRLC16) F5, F6, F7, and F8 MUX Carry Logic MULT_AND Memories (ROM) MULT18x18 / MULT18x18S Global clock buffers (BUFG) Can be inferred using constraints table: SelectI/O (single-ended) I/O Registers (Single Data Rate) BUFGDLL* Cannot be inferred: Memories (RAM) SelectI/O (differential) I/O Registers (Double Data Rate) Global clock buffers (BUFGCE, BUFGMUX) DCM STARTUP_VIRTEX2 HDL Coding Style - 5-17

Synplicity Synplify Pro 7.1 Can be inferred: Shift register LUT (SRL16 / SRLC16) F5, F6, F7, and F8 MUX Carry Logic MULT_AND Memories (distributed RAM) MULT18x18 / MULT18x18S Global clock buffers (BUFG) Can be inferred using constraints editor or attributes: Memories (distributed ROM, some block RAM*) SelectI/O (single-ended) I/O Registers (Single Data Rate) BUFGDLL** HDL Coding Style - 5-18

Synplicity Synplify Pro 7.1 Cannot be inferred: Memories (complex block RAM) SelectI/O (differential) I/O Registers (Double Data Rate) Global clock buffers (BUFGCE, BUFGMUX) DCM STARTUP_VIRTEX2 HDL Coding Style - 5-19

Exemplar Leonardo Spectrum 2002b Can be inferred: Shift register LUT (SRL16 / SRLC16) F5, F6, F7, and F8 MUX Carry Logic MULT_AND Memories (distributed ROM and RAM, some block RAM*) MULT18x18 / MULT18x18S Global clock buffers (BUFG, BUFGDLL**, BUFGCE, BUFGMUX) Can be inferred using constraints editor or attributes: SelectI/O (single-ended) I/O Registers (Single Data Rate) Cannot be inferred Memories (complex block RAM) SelectI/O (differential) I/O Registers (Double Data Rate) DCM STARTUP_VIRTEX2 HDL Coding Style - 5-20

XST 5.1i Can be inferred: Shift register LUT (SRL16 / SRLC16) F5, F6, F7, and F8 MUX Carry Logic MULT_AND Memories (distributed ROM and RAM, block RAM*) MULT18x18 / MULT18x18S Global clock buffers (BUFG) Can be inferred using constraints editor or attributes: SelectI/O I/O Registers (Single Data Rate) Global clock buffers (BUFGCE, BUFGMUX, BUFGDLL**) Cannot be inferred: I/O Registers (Double Data Rate) DCM STARTUP_VIRTEX2 HDL Coding Style - 5-21

Suggested Instantiation Xilinx recommends that you instantiate the following elements: Memory resources Block RAMs specifically (use CORE Generator to build large memories) SelectI/O resources Clock management resources DCM (use the Architecture Wizard) IBUFG, BUFG, BUFGMUX, BUFGCE Startup block HDL Coding Style - 5-22

Suggested Instantiation Why do we suggest this? Easier to change (port) STARTUP Xilinx wrapper top_xlnx to other and newer OBUF_GTL technologies IBUFGDCM BUFG Top-Level OBUF_GTL Fewer synthesis Block IBUF_SSTL2_I OBUF_GTL constraints and attributes to pass on Keeping most of the attributes and constraints in the Xilinx UCF file keeps it simple one file contains critical information Create a separate hierarchical block for instantiating these resources Above the top-level block, create a Xilinx wrapper with Xilinx specific instantiations HDL Coding Style - 5-23

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-24

Review Questions What problem occurs with nested CASE and IF/THEN statements? Which encoding scheme is preferred for high-performance state machines? Which Xilinx resources generally must be instantiated? HDL Coding Style - 5-25

Answers What problem occurs with nested CASE and IF/THEN statements? Nested CASE and IF/THEN statements may generate long delays due to cascaded functions Which encoding scheme is preferred for high-performance state machines? One-hot Which Xilinx resources generally must be instantiated? Double Data Rate I/O registers BUFGMUX BUFGCE DCM STARTUP_VIRTEX2 HDL Coding Style - 5-26

Summary Your HDL coding style can affect synthesis results Infer functions whenever possible Most resources are inferable, either directly or with an attribute CASE and IF/THEN statements produce different types of multiplexers Avoid nested CASE and IF/THEN statements Use one-hot encoding to improve design performance When coding a state machine, separate the next-state logic from state machine output equations HDL Coding Style - 5-27

Where Can I Learn More? Synthesis & Simulation Design Guide: http://support.xilinx.com > Software Manuals Handbooks: http://support.xilinx.com > Documentation > Virtex-II Handbook or Virtex-II Pro Handbook Part 2: Virtex-II User Guide > Chapter 2: Design Considerations Using the DCM, memory, etc. Technical Tips: http://support.xilinx.com > Tech Tips Click Exemplar, Synopsys FPGA Compiler, or Synplicity Answers Database: http://support.xilinx.com > Troubleshoot Synthesis documentation or online help HDL Coding Style - 5-28

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-29

Shift Register LUT (SRL16) Synopsys, Synplicity, Exemplar, and XST To infer the SRL, the primary characteristics the code must have are: No set/reset signal Serial-in, Serial-out SRLs can be initialized on power-up via an INIT attribute in the Xilinx User Constraint File (UCF) HDL Coding Style - 5-30

SRL16E Example VHDL: process(clk) begin if rising_edge(clk) then if ce = 1 then sr <= input & sr(0 to 14); end if; end if; end process; output <= sr(15); Verilog: always @ (posedge clk) begin if (ce) sr <= {in, sr[0:14]}; end assign out <= sr[15]; HDL Coding Style - 5-31

Dynamically Addressable SRL Synopsys, Synplicity, Exemplar, and XST SRL16/SRL16E, and SRLC16/SRLC16E SRLC16 has two outputs in Virtex -II, q15 - final output, and q - dynamically addressable output HDL Coding Style - 5-32

SRLC16E Example VHDL: process(clk) begin if rising_edge(clk) then if CE = 1 then sr <= input & sr(0 to 14); end if; end if; end process; output <= sr(15); dynamic_out <= sr(addr); Verilog: always @ (posedge clk) begin if (ce) sr <= {in, sr[0:14]}; end assign out <= sr[15]; assign dynamic_out <= sr[addr]; HDL Coding Style - 5-33

Virtex-II Multiplexers Synopsys, Synplicity, Exemplar, and XST F5MUX, F6MUX, F7MUX, F8MUX primitives Dedicated multiplexers in Virtex -II CLB Only F5/F6 available in Virtex family 4:1 multiplexer will use one slice 16:1 multiplexer will use 4 slices (1 Virtex-II CLB) 32:1 multiplexer will use 8 slices No attribute needed -- inferred automatically data(7) data(6) data(5) data(4) data(3) data(2) data(1) data(0) F6MUX muxout F5MUX LUT HDL Coding Style - 5-34

F5MUX and F6MUX Example VHDL: process(sel, data) begin case (sel) is when 000 => out <= data(0); when 001 => out <= data(1); when 010 => out <= data(2); when 011 => out <= data(3); when 100 => out <= data(4); when 101 => out <= data(5); when 110 => out <= data(6); when 111 => out <= data(7); when others => out <= 0 ; end case; end process; Verilog: always @ (sel or data) case(sel) 3'b000: muxout = data[0]; 3'b001: muxout = data[1]; 3'b010: muxout = data[2]; 3'b011: muxout = data[3]; 3'b100: muxout = data[4]; 3'b101: muxout = data[5]; 3'b110: muxout = data[6]; 3'b111: muxout = data[7]; default : muxout = 0; endcase HDL Coding Style - 5-35

Flip-flop Set/Reset Conditions When using asynchronous set and asynchronous reset, reset has priority When using synchronous set and synchronous reset, reset has priority When using any combination of asynchronous set/reset with synchronous set/reset: Asynchronous set/reset has priority (furthermore, reset has highest priority) In this mode, the synchronous set and/or reset is implemented in the LUT The priority of the synchronous set versus synchronous reset is defined by how the HDL is written HDL Coding Style - 5-36

Flip-Flop Example VHDL: process(clk, reset, set) begin if (reset = 1 ) then q <= 0 ; elsif (set = 1 ) then q <= 1 ; elsif rising_edge(clk) then if (sync_set = 1 ) then q <= 1 ; elsif (sync_reset = 1 ) then q <= 0 ; elsif (ce = 1 ) then q <= d; end if; end if; end process; Verilog: always @ (posedge clk or posedge reset or posedge set) if (reset) q = 0; else if (set) q = 1; else if (sync_set) q = 1; else if (sync_reset) q = 0; else if (ce) q = d; end HDL Coding Style - 5-37

Carry Logic Synopsys, Synplicity, Exemplar, and XST Synthesis maps directly to the dedicated carry logic Access carry logic through adders, subtractors, counters, comparators (>15 bits) and other arithmetic operations Adders / subtractors (SUM <= A + B) Comparators (if A < B then) Counters (COUNT <= COUNT + 1) Note: Carry logic will not be inferred if arithmetic components are built with gates For example: XOR gates for addition and an AND gate for carry logic will not infer carry logic HDL Coding Style - 5-38

Carry Logic Examples VHDL: count <= count + 1 when (addsub = 1 ) else count - 1; if (a >= b) then a_greater_b <= 1 ; product <= constant * multiplicand; Verilog: assign count = addsub? count + 1: count - 1; if (a >= b) a_greater_b = 1; assign product = constant * multiplicand; HDL Coding Style - 5-39

MULT18x18 Synopsys, Synplicity, Exemplar, and XST Synplicity and Exemplar infer MULT18x18 by default Synplify, to use MULT_18x18 set: syn_multstyle = block_mult (default) Possible values are block_mult and logic Exemplar, to use MULT_18x18 set: virtex2_multipliers = true (default) HDL Coding Style - 5-40

CLB MULT_AND Synopsys, Synplicity, Exemplar, and XST Synplicity set: syn_multstyle = logic Exemplar set: virtex2_multipliers = false Synopsys will use MULT_AND by default By+1 Ax-1 By A x LUT S LO DI CI MUXCY_L LI CI XORCY_L LO MULT_AND HDL Coding Style - 5-41

Multiplier Example VHDL: library ieee; use ieee.std_logic_signed.all; use ieee.std_logic_unsigned.all; process (clk, reset) begin if (reset = 1 ) then product <= (others => 0 ); elsif rising_edge(clk) then product <= a * b; end if; end process; Verilog: always @ ( posedge clk or posedge reset) begin if (reset) product <= 0; else product <= a * b; end HDL Coding Style - 5-42

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-43

Block SelectRAM Synplicity, Exemplar, and XST Synplicity: Set the syn_ramstyle attribute to block_ram Place the attribute on the output signal driven by the inferred RAM Requires synchronous write Requires registered read address Dual-port RAM inferred if read/write address index is different Exemplar: Automatically inferred under these conditions: Synchronous write Registered read address XST: Based on the size and characteristics of the code, XST can automatically select the best style Available settings: Auto, Block, Distributed HDL Coding Style - 5-44

Block RAM Inference Notes Synplicity, Exemplar, and XST Synthesis tools cannot infer: Dual-Port block RAMs with configurable aspect ratios Ports with different widths Block RAMs with enable or reset functionality Always enabled Output register cannot be reset Dual-Port block RAMs with read and write capability on both ports Block RAMs with read capability on one port and write on the other port can be inferred Dual-Port functionality with different clocks on each port These limitations on inferring block RAMs can be overcome by creating the RAM with the CORE Generator or instantiating primitives HDL Coding Style - 5-45

Block RAM Example VHDL: signal mem: mem_array; attribute syn_ramstyle of mem: signal is block_ram ; process (clk) begin if rising_edge(clk) then addr_reg <= addr; if (we = 1 ) then mem(addr) <= din; end if; end if; end process; dout <= mem(addr); Verilog: reg [31:0] mem[511:0] /*synthesis syn_ramstyle = block_ram */; always @ ( posedge clk) begin addr_reg <= addr; if (we) mem[addr] <= din; end assign dout = mem[addr_reg]; HDL Coding Style - 5-46

Distributed SelectRAM Synplicity, Exemplar, and XST Each LUT can implement a 16x1-bit synchronous RAM Automatic inference when code is written with two requirements: Write must be synchronous Read must be asynchronous However, if the read address is registered, the SelectRAM can be inferred and will be driven by a register Synplicity: Automatically used -- turn off by setting attribute: syn_ramstyle = registers or block_ram Exemplar: Automatically used if RAM is less than eight bits wide Or set block_ram = false on RAM output signal XST: Specify block or distributed RAM, or let XST automatically select the best implementation style HDL Coding Style - 5-47

Distributed RAM Example VHDL: signal mem: mem_array; process (clk) begin if rising_edge(clk) then if (we = 1 ) then mem(addr) <= din; end if; end if; end process; dout <= mem(addr); Verilog: reg [7:0] mem[31:0]; always @ ( posedge clk) begin if (we) mem[addr] <= din; end assign dout = mem[addr]; HDL Coding Style - 5-48

ROM Synopsys, Synplicity, Exemplar, and XST Synplicity: infer ROM primitives with an attribute Set syn_romstyle = select_rom Otherwise, Synplify will infer a LUT primitive with equations Same implementation, except it is not a ROM primitive Exemplar, Synopsys, and XST will automatically map to ROM primitives HDL Coding Style - 5-49

Distributed ROM Example VHDL: type rom_type is array(7 downto 0) of std_logic_vector(1 downto 0); constant rom_table: rom_type := ( 10, 00, 11, 01, 11, 10, 01, 00 ); attribute syn_romstyle: string; attribute syn_romstyle of rom_table: signal is select_rom ; rom_dout <= rom_table(addr); Verilog: reg [1:0] rom_dout /*synthesis syn_romstyle = select_rom */; always @ ( addr) case (addr) 3 b000: rom_dout <= 2 b00; 3 b001: rom_dout <= 2 b01; 3 b010: rom_dout <= 2 b10; 3 b011: rom_dout <= 2 b11; 3 b100: rom_dout <= 2 b01; 3 b101: rom_dout <= 2 b11; 3 b110: rom_dout <= 2 b00; 3 b111: rom_dout <= 2 b10; endcase HDL Coding Style - 5-50

Outline Introduction Coding Tips Instantiating Resources Summary Appendix: Inferring Logic and Flip-flop Resources Inferring Memory Inferring I/Os and Global Resources HDL Coding Style - 5-51

SelectI/O Synopsys, Synplicity, and Exemplar Instantiate in HDL code (required for differential I/O) For a complete list of buffers, see the following elements in the Libraries Guide : IBUF_selectIO, IBUFDS IBUFG_selectIO, IBUFGDS IOBUF_selectIO OBUF_selectIO, OBUFT_selectIO, OBUFDS, OBUFTDS Use attribute (Synplicity, Exemplar) Specify in the UCF file Use Xilinx Constraints Editor In the Ports tab, check the I/O Configuration Options box HDL Coding Style - 5-52

SelectI/O Synopsys: Ports tab of FPGA Compiler II constraints editor Synplicity: Use xc_padtype attribute Exemplar: Use buffer_sig attribute XST: Instantiate or use Xilinx Constraints Editor HDL Coding Style - 5-53

SelectI/O Example VHDL: component IBUF_HSTL_III port (I: in std_logic; end component;... O: out std_logic); ibuf_data_in_inst: IBUF_HSTL_III port map (I => data_in, O => data_in_i); Verilog: /* For primitive instantiations in Verilog you must use UPPERCASE for the primitive name and port names */ IBUF_HSTL_III ibuf_data_in_inst (.I(data_in),.O(data_in_i)); HDL Coding Style - 5-54

IOB Registers Synopsys, Synplicity, Exemplar, and XST For Single Data Rate I/O registers: Set Map Process Properties > Pack I/O Registers/Latches into IOBs Use the IOB = TRUE attribute in the UCF file Use on instantiated FFs or inferred FFs with known instance name Example: INST <FF_instance_name> IOB = TRUE; Synopsys: Ports tab in FPGA Compiler II constraints editor Synplicity: Automatically packs registers in the IOB, based on timing To override default behavior, use the syn_useioff attribute Exemplar: virtex_map_iob_registers = TRUE XST: Automatically packs registers in the IOB, based on timing To override default behavior under Synthesize > Properties > Xilinx Specific Options tab > Pack I/O Registers into IOBs > Auto, Yes, or No HDL Coding Style - 5-55

IOB Registers Synopsys, Synplicity, Exemplar, and XST Double Data Rate registers must be instantiated See the following elements in the Libraries Guide : IFDDRCPE, IFDDRRSE (for input flip-flops) OFDDRCPE, OFDDRRSE (for output or 3-state enable flip-flops) OFDDRTCPE, OFDDRTRSE (for output flip-flops) HDL Coding Style - 5-56

IOB Registers Limitations: All flip-flops that are packed into the same IOB must share the same clock and reset signal They can have independent clock enables Output and 3-state enable registers must have a fanout of one Synopsys and Synplicity will automatically replicate 3-state enable registers to enable packing into IOBs Exemplar can replicate 3-state enable registers for packing into IOBs by setting virtex_map_iob_registers = TRUE Output 3-state enables must be active-low There is logic in the IOB to invert 3-state enable signal before the register DDR registers must use clk and not clk with 50 percent duty-cycle or DLL outputs clk0 and clk180 HDL Coding Style - 5-57

I/O Register Example VHDL: process(clk, reset) begin if (reset = 1 ) then data_in_i <= 0 ; data_out <= 0 ; out_en <= 1 ; elsif rising_edge(clk) then data_in_i <= data_in; out_en <= out_en_i; if (out_en = 0 ) then data_out <= data_out_i; end if; end if; end process; Verilog: always @ (posedge clk or posedge reset) if (reset) begin data_in_i <= 0; data_out <= 0; out_en <= 1; end else begin data_in_i <= data_in; out_en <= out_en_i; if (~out_en) data_out <= data_out_i; end HDL Coding Style - 5-58

Global Buffers BUFG All synthesis tools will infer on input signals that drive the clock pin of any synchronous element BUFGDLL Synopsys: Specify in the Ports tab of FPGA Compiler II constraints editor Synplicity: Can be inferred through synthesis by setting attribute xc_clockbuftype = BUFGDLL Exemplar: Can be inferred through synthesis by setting attribute PAD = BUFGDLL or BUFGDLLHF XST: Must instantiate BUFGCE Exemplar: Can be inferred by setting virtex2_clock_mux = TRUE HDL Coding Style - 5-59

DCM Digital Clock Manager Clock de-skew Frequency synthesis Phase shifting Must be instantiated Port names are as shown in diagram HDL Coding Style - 5-60

STARTUP_VIRTEX2 Provides three functions Global set/reset (GSR) Global Three-State for output pins (GTS) User-defined configuration clock to synchronize configuration startup sequence Must be instantiated Port names are GSR, GTS, and CLK Note: Using GSR is not recommended for Virtex -II designs Normal routing resources are faster and plentiful HDL Coding Style - 5-61