MyHDL è un linguaggio di descrizione hardware (HDL) basato su Python.

MyHDL supporta le seguenti caratteristiche principali:

  • Un sistema di tipi di dati orientati all'hardware che semplificano la definizione di modelli hardware.
  • Il supporto per tecniche di modellazione di alto livello (bus functional modeling, modellazione di memorie con tipi di dato nativi, modellazione con approccio orientato agli oggetti).
  • La capacità di raggruppare più segnali in un'interfaccia e di convertire un elenco di segnali[1].
  • La possibilità di usare tecniche di verifica software moderne, come ad esempio i test unitari, su progetti hardware.
  • La capacità di convertire testbench MyHDL in testbench basati su linguaggi HDL tradizionali, come Verilog o VHDL[2].
  • Co-simulazione di modelli MyHDL e modelli basati su altri linguaggi HDL, come Verilog o VHDL[3].
  • Conversione dei modelli MyHDL in modelli HDL tradizionali, tramite generazione automatica di codice Verilog o VHDL[4].

MyHDL è sviluppato da Jan Decaluwe[5].

Esempi di conversione

modifica

Di seguito sono riportati alcuni esempi di conversioni da progetti MyHDL a VHDL e/o Verilog[6].

Un semplice modulo combinatorio

L'esempio è un semplice modulo combinatorio, più specificatamente un convertitore da codice binario a codice Gray:

def bin2gray(B, G, width: int):
  """Gray encoder.

  B -- input intbv signal, binary encoded
  G -- output intbv signal, gray encoded
  width -- bit width
  """

  @always_comb
  def logic():
    Bext = intbv(0)[width + 1 :]
    Bext[:] = B
    for i in range(width):
      G.next[i] = Bext[i + 1] ^ Bext[i]

  return logic

È possibile definire un'istanza e convertirla in Verilog e VHDL come segue:

width = 8

B = Signal(intbv(0)[width:])
G = Signal(intbv(0)[width:])

bin2gray_inst = toVerilog(bin2gray, B, G, width)
bin2gray_inst = toVHDL(bin2gray, B, G, width)

Il codice Verilog generato appare come segue:

module bin2gray (
  B,
  G
);

input [7:0] B;
output [7:0] G;
reg [7:0] G;

always @(B) begin: BIN2GRAY_LOGIC
  integer i;
  reg [9-1:0] Bext;
  Bext = 9'h0;
  Bext = B;
  for (i=0; i<8; i=i+1) begin
    G[i] <= (Bext[(i + 1)] ^ Bext[i]);
  end
end

endmodule

Il codice VHDL generato si presenta come segue:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use std.textio.all;

use work.pck_myhdl_06.all;

entity bin2gray is
  port (
    B: in unsigned(7 downto 0);
    G: out unsigned(7 downto 0)
  );
end entity bin2gray;

architecture MyHDL of bin2gray is

begin

BIN2GRAY_LOGIC: process (B) is
  variable Bext: unsigned(8 downto 0);
begin
  Bext := to_unsigned(0, 9);
  Bext := resize(B, 9);
  for i in 0 to 8-1 loop
    G(i) <= (Bext((i + 1)) xor Bext(i));
  end loop;
end process BIN2GRAY_LOGIC;

end architecture MyHDL;


Riferimenti

modifica
  1. ^ (EN) Conversion of lists of signals, su The MyHDL Manual. URL consultato il 30 Novembre 2024.
  2. ^ (EN) Conversion of test benches, su The MyHDL Manual. URL consultato il 30 Novembre 2024.
  3. ^ (EN) Co-simulation with Verilog, su The MyHDL Manual. URL consultato il 30 Novembre 2024.
  4. ^ (EN) Conversion to Verilog and VHDL, su The MyHDL Manual. URL consultato il 30 Novembre 2024.
  5. ^ (EN) Jan Decaluwe, MyHDL: a Python-Based Hardware Description Language, su linuxjournal.com. URL consultato il 30 Novembre 2024.
  6. ^ (EN) Conversion Examples, su The MyHDL Manual. URL consultato il 30 Novembre 2024.

Collegamenti esterni

modifica