Hardware components are developed as static modules, that for a given set of inputs generate a set of outputs within a bounded latency. The component is developed for a specific task and changes to the use case involve code refactor. Targeting an easier solution for module configuration and parameterization, specific constructs were built into the Hardware Description Languages(HDL) that allow the Hardware Designer to implement and instantiate several configurations of an HDL module without requiring to rewrite code.


Parameters are an HDL construct used for the development of parameterized modules and are mostly used in the declaration of the module’s…

The Computer processor is a logic circuit designed to process data based on a set of instructions, programmed into the code memory. The processor includes the circuitry required for supporting the ISA as well as dedicated logic for more specific tasks, such as the popular ALU that targets logic and arithmetic operations within the computer. Modern computers achieve better performances by exploitation of Instruction-Level Parallelism, by a pipelined implementation of the processor.

Instruction Level Parallelism

Instruction Level Parallelism(ILP) is the parallel processing of multiple instructions from a thread of execution, that can be implemented at the Software and Hardware level.

The hardware implementation…

An Instruction Set Architecture is an abstract model of a computer, responsible for the definition of the Data Types, Registers, and the components that manage the Main Memory and the fundamental operation required in a generic computer system, such as Integer Arithmetics.

The ISA designates the behavior of the machine code in the developed computer, providing binary compatibility between different implementations and enabling multiple implementations of the same IS differing in performance, physical size, and manufacturing cost to run the same machine code.

This ISA characteristic makes it possible for lower-performance, lower-cost computers to be replaced with higher-cost, higher-performance machines…

The growing complexity of software in Embedded Systems has been demanding more computation power, either by the implementation of more competent CPU or through Hardware components, designed for the realization of specifc tasks.

Hardware components are developed through Hardware Description Languages, describing the structure and the behavior of the circuitry to be implemented, and verified in FPGA fabric before implementation in ASIC, avoiding unwanted manufactoring cost associated to possible existing bugs in the component.

Hardware Description Languages

Hardware Descriptor Languages are computer languages dedicated for modeling the structure and behavior of digital logic circuits, as well as for precise simulation of already developed…

Current systems integrate very complex software components while trying to keep the hardware to the minimal, leading to extraordinary loads on the CPU and consequently performance problems.

Modern SoC have the highest performance-per-watt relation, faster memory operations and with the integration of FPGA fabric enable the implementation of any algorithm, or parts of one, as a hardware component, which increases the overall system performance.


The FPGA fabric is divided, essentially, in CLB (configurable Logic Blocks) which can be used to emulated any kind of circuit, independently of its complexity or size. …

An Embedded System is a computer designed both in hardware and software to better fit the needs of task within a system. For these types of system the Hardware-Software Co-Design methodology is critical for achieving the wanted performance and meet the defined constraints.

Hardware-Software Co-Design development flow, represented in the figure 1, is divided in a series of stages, which are repeated until the final result is satisfactory.

The magic of User Defined Data Structure A.K.A Classes

The ability to create a User Defined Data Structure is a important and very used feature of any object oriented language. It allow us to define a new type of data, as well as methods to handle it. There’s also polymorphism and inheritance that play a huge part when we are thinking on long term and portability. …

One of the most important features of a programming language is the ability to let the programmer structurize its algorithm in chunks of code, named functions. This way the code readability and scalability increases, also maintainability as well since it’s easier to make a change into some part of the algorithm if it is isolated.

When a function is created it is stored in memory, unknown to the programmer, so when you call it the processor has to jump between memory addresses, allocate a new stack for the function and, after all sentences have been executed, return to the callee.

When programming we need to understand that nothing is as plain or simple as it seems when we do those operations mentally. For example assigning a value to a variable. This seems like a pretty straightforward operation but it doesn’t happen in one operation as one would think. So let’s dive into a simple program with just a declaration and a assignment:

Fábio Magalhães

Engineer @ Synopsys

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store