Módulos utilizados:
TesteBench_Decoder.vhd (top level);
RegistradorGenerico.vhd;
SomaConstante.vhd;
DecoderAula5.vhd (decoder em teste);
Arquivo: TesteBench_Decoder.vhd (top level).
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity TesteBench_Decoder is
generic (
DATA_WIDTH : natural := 12;
ADDR_WIDTH : natural := 4
);
port (
-- Input ports
clk : in std_logic;
-- Output ports
opCode : out std_logic_vector(ADDR_WIDTH-1 downto 0);
resultado : out std_logic
);
end entity;
architecture arch_name of TesteBench_Decoder is
signal vetor_entrada : std_logic_vector(ADDR_WIDTH-1 downto 0);
signal vetor_saida_ROM : std_logic_vector(DATA_WIDTH-1 downto 0);
signal vetor_saida : std_logic_vector(DATA_WIDTH-1 downto 0);
signal comparacao : std_logic_vector(DATA_WIDTH-1 downto 0);
signal proxPC : std_logic_vector(ADDR_WIDTH-1 downto 0);
begin
PC : entity work.registradorGenerico generic map (larguraDados => ADDR_WIDTH)
port map (DIN => proxPC,
DOUT => vetor_entrada,
ENABLE => '1',
CLK => clk,
RST => '0');
incrementaPC : entity work.somaConstante generic map (larguraDados => ADDR_WIDTH, constante => 1)
port map( entrada => vetor_entrada,
saida => proxPC);
ROM1 : entity work.memoriaROM generic map (dataWidth => DATA_WIDTH, addrWidth => ADDR_WIDTH)
port map (Endereco => vetor_entrada,
Dado => vetor_saida_ROM);
decoder: entity work.decoderAula5
port map (entrada_dec => vetor_entrada, saida_dec => vetor_saida);
comparacao(0) <= vetor_saida(0) xor vetor_saida_ROM(0);
comparacao(1) <= vetor_saida(1) xor vetor_saida_ROM(1);
comparacao(2) <= vetor_saida(2) xor vetor_saida_ROM(2);
comparacao(3) <= vetor_saida(3) xor vetor_saida_ROM(3);
comparacao(4) <= vetor_saida(4) xor vetor_saida_ROM(4);
comparacao(5) <= vetor_saida(5) xor vetor_saida_ROM(5);
comparacao(6) <= vetor_saida(6) xor vetor_saida_ROM(6);
comparacao(7) <= vetor_saida(7) xor vetor_saida_ROM(7);
comparacao(8) <= vetor_saida(8) xor vetor_saida_ROM(8);
comparacao(9) <= vetor_saida(9) xor vetor_saida_ROM(9);
comparacao(10) <= vetor_saida(10) xor vetor_saida_ROM(10);
comparacao(11) <= vetor_saida(11) xor vetor_saida_ROM(11);
resultado <= not(comparacao(11) or comparacao(10) or comparacao(9) or comparacao(8) or comparacao(7) or comparacao(6) or comparacao(5) or comparacao(4) or comparacao(3) or comparacao(2) or comparacao(1) or comparacao(0));
opCode <= vetor_entrada;
end architecture;
Arquivo: memoriaROM.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity memoriaROM is
generic (
dataWidth: natural := 12;
addrWidth: natural := 9
);
port (
Endereco : in std_logic_vector (addrWidth-1 DOWNTO 0);
Dado : out std_logic_vector (dataWidth-1 DOWNTO 0)
);
end entity;
architecture assincrona of memoriaROM is
constant ctlNOP : std_logic_vector(dataWidth-1 downto 0) := "000000000000"; -- 0
constant ctlLDA : std_logic_vector(dataWidth-1 downto 0) := "000000101010"; -- 1
constant ctlSOMA : std_logic_vector(dataWidth-1 downto 0) := "000000110010"; -- 2
constant ctlSUB : std_logic_vector(dataWidth-1 downto 0) := "000000100010"; -- 3
constant ctlLDI : std_logic_vector(dataWidth-1 downto 0) := "000001101000"; -- 4
constant ctlSTA : std_logic_vector(dataWidth-1 downto 0) := "000000001001"; -- 5
constant ctlJMP : std_logic_vector(dataWidth-1 downto 0) := "010000001000"; -- 6
constant ctlJEQ : std_logic_vector(dataWidth-1 downto 0) := "000010001000"; -- 7
constant ctlCEQ : std_logic_vector(dataWidth-1 downto 0) := "000000000110"; -- 8
constant ctlJSR : std_logic_vector(dataWidth-1 downto 0) := "100100001000"; -- 9
constant ctlRET : std_logic_vector(dataWidth-1 downto 0) := "001000001000"; -- A
type blocoMemoria is array(0 TO 2**addrWidth - 1) of std_logic_vector(dataWidth-1 DOWNTO 0);
function initMemory
return blocoMemoria is variable tmp : blocoMemoria := (others => (others => '0'));
begin
tmp(0) := ctlNOP;
tmp(1) := ctlLDA;
tmp(2) := ctlSOMA;
tmp(3) := ctlSUB;
tmp(4) := ctlLDI;
tmp(5) := ctlSTA;
tmp(6) := ctlJMP;
tmp(7) := ctlJEQ;
tmp(8) := ctlCEQ;
tmp(9) := ctlJSR;
tmp(10) := ctlRET;
-- tmp(11) := ctl;
-- tmp(12) := ctl;
-- tmp(13) := ctl;
-- tmp(14) := ctl;
-- tmp(15) := ctl;
return tmp;
end initMemory;
signal memROM : blocoMemoria := initMemory;
begin
Dado <= memROM (to_integer(unsigned(Endereco)));
end architecture;
Bit 11 | Bit 10 | Bit 9 | Bit 8 | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|---|---|---|---|---|---|
habEscritaRetorno | JMP | RET | JSR | JEQ | SelMUX | Habilita A | Operação Bit 1 | Operação Bit 0 | HabFlagIgual | HabLeituraMEM | HabEscritaMEM |
Este é o programa que faz a interface entre o computador e a FPGA, repassando os valores lidos para o tratamento pelo programa leProbe.py. Ele deve ser criado com o nome getHW.tcl e ficar no mesmo diretório do programa leProbe.py mostrado mais abaixo.
Nome do arquivo: getHW.tcl
# Load Quartus Prime Tcl Package
#package require ::quartus::insystem_source_probe
variable usb
variable debug
proc inicializaHardware {} {
global usb device_name debug
if { [catch {set usb [lindex [get_hardware_names] 0]} id_erro]} {
puts "Erro ao ler o probe: $id_erro"
exit
}
if { [catch {set device_name [lindex [get_device_names -hardware_name $usb] 0]} id_erro] } {
puts "Erro ao obter o nome do device: $id_erro"
exit
}
}
# Leitura do probe número 0:
proc ler_probe {} {
global device_name usb Leitura
variable Leitura
if { [catch {start_insystem_source_probe -device_name $device_name -hardware_name $usb} id_erro] } {
puts "Erro ao iniciar o probe: $id_erro"
exit
}
if { [catch {set Leitura [read_probe_data -instance_index 0]} id_erro]} {
puts "Erro ao ler o probe: $id_erro"
exit
}
end_insystem_source_probe
#puts "Valor do PROBE, lido em binário: $Leitura"
return $Leitura
}
inicializaHardware
set valorBinario [ler_probe]
# Remove todos os espaços da string
set valorBinario [string map {" " ""} $valorBinario]
set valorBinario [format %0512s $valorBinario]
set binario [string range $valorBinario 0 511]
#puts "$usb"
#puts "$device_name"
puts "$binario"
Este arquivo deve ser criado em um diretório juntamente com o getHW.tcl. Ele recebe a leitura do probe, feita pelo programa getHW.tcl (mostrado acima), e mostra na tela os valores dos sinais internos da FPGA. Para tanto, ele utiliza o módulo quartus_stp (presente no diretório do quartus/bin ou quartus/bin64).
Para o Linux, é necessário acertar o caminho do arquivo quartus_stp para refletir a instalação feita no seu computador. Para o Windows, deve-se colocar o diretório do quartus_stp no PATH e acertar a variável win para o valor 1.
Nome do arquivo: leProbe.py
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
import subprocess;
def leProbe():
win=0;
if win == 1:
# Para Windows, deve colocar o diretório intelFPGA_lite/20.1/quartus/bin64 no PATH.
programa = ['quartus_stp.exe', '-t', 'getHW.tcl']
else:
caminho = '/home/paulo/intelFPGA_lite/20.1/quartus/bin/'
programa = [caminho+'quartus_stp', '-t', 'getHW.tcl']
# quartus_stp -t getHW.tcl
leitura = subprocess.Popen(programa, stdout=subprocess.PIPE, stderr=subprocess.STDOUT);
stdout,stderr = leitura.communicate()
# O replace compatibiliza o New Line entre o Windows e o Linux
valor = stdout.decode("utf-8").replace('\r\n','\n');
binario = valor.split('getHW.tcl\n')[1].split('\n')[0]
return binario;
def convREG(numREG):
nomeREG = {'00000': 'Zero','00001': 'at','00010': 'v0','00011': 'v1','00100': 'a0','00101': 'a1','00110': 'a2', '00111': 'a3',
'01000': 't0', '01001': 't1', '01010': 't2', '01011': 't3', '01100': 't4', '01101': 't5', '01110': 't6', '01111': 't7',
'10000': 's0', '10001': 's1', '10010': 's2', '10011': 's3', '10100': 's4', '10101': 's5', '10110': 's6', '10111': 's7',
'11000': 't8', '11001': 't9', '11010': 'k0', '11011': 'k1', '11100': 'gp', '11101': 'sp', '11110': 'fp', '11111': 'ra'};
return nomeREG[numREG];
def convInstrucao(opcode, funct):
if opcode == '000000':
if funct == '000000':
return ('NOP');
elif funct == '001000':
return ('JR');
elif funct == '100000':
return ('ADD');
elif funct == '100010':
return ('SUB');
elif funct == '100100':
return ('AND');
elif funct == '100101':
return ('OR');
elif funct == '101010':
return ('SLT');
else:
return ('Erro. opCode: '+str(opcode)+' - funct: '+str(funct));
else:
if opcode == '000010':
return 'JMP';
elif opcode == '000011':
return 'JAL';
elif opcode == '000100':
return 'BEQ';
elif opcode == '000101':
return 'BNE';
elif opcode == '000101':
return 'BNE';
elif opcode == '001000':
return 'ADDI';
elif opcode == '001010':
return 'SLTI';
elif opcode == '001100':
return 'ANDI';
elif opcode == '001101':
return 'ORI';
elif opcode == '001111':
return 'LUI';
elif opcode == '100011':
return 'LW';
elif opcode == '101011':
return 'SW';
else:
return 'ERRO. opCode: '+str(opcode)+' - funct: '+str(funct);
def convULActrl(ULACTRL):
if ULACTRL == '0000':
return 'AND';
elif ULACTRL == '0001':
return 'OR';
elif ULACTRL == '0010':
return 'Soma';
elif ULACTRL == '0110':
return 'Sub';
elif ULACTRL == '0111':
return 'SLT';
else:
return 'ERRO';
def convHEXA(valor, comprimento):
valor = int(valor,2)
return "{0:#0{1}X}".format(valor, comprimento)
# Explanation:
# { # Format identifier
# 0: # first parameter
# # # use "0x" prefix
# 0 # fill with zeroes
# {1} # to a length of n characters (including 0x), defined by the second parameter
# x # hexadecimal number, using lowercase letters for a-f
# X # hexadecimal number, using uppercase letters for A-F
# } # End of format identifier
def convPtCtrl(selMUXPCBEQJMP, selMUXRTRD, habilitaEscritaC, selMUXRTIMED, selMUXULAMEM, BEQ, WR, RD):
if selMUXPCBEQJMP == '1':
if habilitaEscritaC == '0' and WR == '0':
return 'JMP';
else:
return 'Erro no JMP'
if selMUXRTRD == '1' and habilitaEscritaC == '1' and selMUXULAMEM == '0':
if WR == '0' and selMUXRTIMED == '0':
return 'Tipo R';
else:
return 'Erro no Tipo R'
if selMUXRTRD == '0' and habilitaEscritaC == '1' and selMUXULAMEM == '1':
if WR == '0' and selMUXRTIMED == '1':
return 'LW';
else:
return 'Erro no LW'
if WR == '1':
if RD == '0' and selMUXRTIMED == '1' and habilitaEscritaC == '0':
return 'SW';
else:
return 'Erro no SW'
if BEQ == '1':
if RD == '0' and WR == '0' and selMUXRTIMED == '0' and habilitaEscritaC == '0':
return 'BEQ';
else:
return 'Erro no BEQ'
return 'Nao Definido'
def main(argv=None):
# Interpretação da seleçãos dos MUXes:
MUXJMP = {'0': 'PC+4 ou BEQ', '1': 'Jump'};
MUXRTRD = {'0': 'RT', '1': 'RD'};
MUXRTIMED = {'0': 'RT', '1': 'Imediato'};
MUXULAMEM = {'0': 'Saída da ULA', '1': 'Memória'};
#
valor = leProbe();
PC = valor[480:512]
Instrucao = valor[448:480]
opCode = Instrucao[0:6]
funct = Instrucao[26:32]
enderecoRS = Instrucao[6:11]
enderecoRT = Instrucao[11:16]
enderecoRD = Instrucao[16:21]
Imediato = Instrucao[16:32]
conteudoRS = valor[416:448]
conteudoRT = valor[384:416]
valorRD = valor[352:384]
EntradaBULA = valor[320:352]
ImediatoExtendido = valor[288:320]
SaidaULA = valor[256:288];
DadoLidoRAM = valor[224:256];
ProxPC = valor[192:224];
MUXProxPC_EntradaA = valor[160:192];
MUXProxPC_EntradaB = valor[128:160];
#
flagZERO = valor[13];
selMUXPCBEQJMP = valor[12];
selMUXRTRD = valor[11];
selMUXRTIMED = valor[10];
selMUXULAMEM = valor[9];
BEQ = valor[8];
WR = valor[7];
RD = valor[6];
ULActrl = valor[2:6];
habilitaEscritaC = valor[1];
print (' Binario Hexa Decimal');
print ('Etapa de Busca:');
print ('Program Counter: '+str(PC)+' - '+convHEXA(PC, 10)+' - '+str(int(PC,2)) );
print ('MUXProxPC EntradaA: '+str(MUXProxPC_EntradaA)+' - '+convHEXA(MUXProxPC_EntradaA, 10)+' - '+str(int(MUXProxPC_EntradaA,2)) );
print ('MUXProxPC EntradaB: '+str(MUXProxPC_EntradaB)+' - '+convHEXA(MUXProxPC_EntradaB, 10)+' - '+str(int(MUXProxPC_EntradaB,2)) );
print ('ProxPC: '+str(ProxPC)+' - '+convHEXA(ProxPC, 10)+' - '+str(int(ProxPC,2)) );
print ('Instrucao: '+str(Instrucao)+' - '+convHEXA(Instrucao, 10) );
print ('Imediato Estendido: '+str(ImediatoExtendido)+' - '+convHEXA(ImediatoExtendido, 10)+' - '+str(int(ImediatoExtendido,2)) );
print ('\nBanco Registradores:');
print ('Leitura de RS: '+str(conteudoRS)+' - '+convHEXA(conteudoRS,10)+' - '+str(int(conteudoRS,2)));
print ('Leitura de RT: '+str(conteudoRT)+' - '+convHEXA(conteudoRT,10)+' - '+str(int(conteudoRT,2)));
print ('Escrita para RD: '+str(valorRD)+' - '+convHEXA(valorRD,10)+' - '+str(int(valorRD,2)));
print ('Habilita Escrita RD: '+str(habilitaEscritaC));
print ('\nULA:');
print ('Entrada A da ULA: '+str(conteudoRS)+' - '+convHEXA(conteudoRS,10)+' - '+str(int(conteudoRS,2)));
print ('Entrada B da ULA: '+str(EntradaBULA)+' - '+convHEXA(EntradaBULA,10)+' - '+str(int(EntradaBULA,2)));
print ('Saida da ULA: '+str(SaidaULA)+' - '+convHEXA(SaidaULA,10)+' - '+str(int(SaidaULA,2)));
print ('Flag de Zero: '+str(flagZERO));
print ('Controle da ULA: '+str(ULActrl)+' - '+convULActrl(ULActrl));
print ('\nPontos de Controle:');
print ('selMUX Jump/(BEQ PC+4): '+str(selMUXPCBEQJMP)+' - '+MUXJMP[selMUXPCBEQJMP]);
print ('selMUX RT/RD: '+str(selMUXRTRD)+' - '+MUXRTRD[selMUXRTRD]);
print ('selMUX RT/Imediato: '+str(selMUXRTIMED)+' - '+MUXRTIMED[selMUXRTIMED]);
print ('Habilita Escrita RD: '+str(habilitaEscritaC));
print ('selMUX ULA/MEM: '+str(selMUXULAMEM)+' - '+MUXULAMEM[selMUXULAMEM]);
print ('BEQ: '+str(BEQ));
print ('Habilita Leitura RAM: '+str(RD));
print ('Habilita Escrita RAM: '+str(WR));
print ('\nInterpretacao:');
print ('Instrucao: '+convInstrucao(opCode, funct)+' RD:'+convREG(enderecoRD)+' RS:'+convREG(enderecoRS)+' RT:'+convREG(enderecoRT)+' Imed:'+convHEXA(Imediato, 6) );
print ('');
result = convPtCtrl(selMUXPCBEQJMP=selMUXPCBEQJMP, selMUXRTRD=selMUXRTRD, habilitaEscritaC=habilitaEscritaC,
selMUXRTIMED=selMUXRTIMED, selMUXULAMEM=selMUXULAMEM, BEQ=BEQ, WR=WR, RD=RD);
print ('Pontos de Controle: '+result);
print ('=============================\n');
if __name__ == "__main__":
main()
O arquivo debugMonitor.vhd é a interface com o probe de teste e deve ser criado no diretório raíz do projeto do Quartus e adicionado ao projeto.
Nome do arquivo: debugMonitor.vhd
library ieee;
use ieee.std_logic_1164.all;
entity debugMonitor is
generic (
DATA_WIDTH : natural := 32;
ADDR_WIDTH : natural := 32;
PROBE_WDTH : natural := 511
);
port (
-- Input ports
PC : in std_logic_vector(ADDR_WIDTH-1 downto 0);
Instrucao : in std_logic_vector(DATA_WIDTH-1 downto 0);
LeituraRS : in std_logic_vector(DATA_WIDTH-1 downto 0);
LeituraRT : in std_logic_vector(DATA_WIDTH-1 downto 0);
EscritaRD : in std_logic_vector(DATA_WIDTH-1 downto 0);
EntradaB_ULA : in std_logic_vector(DATA_WIDTH-1 downto 0);
imediatoEstendido : in std_logic_vector(DATA_WIDTH-1 downto 0);
saidaULA : in std_logic_vector(DATA_WIDTH-1 downto 0);
dadoLido_RAM : in std_logic_vector(DATA_WIDTH-1 downto 0);
proxPC : in std_logic_vector(DATA_WIDTH-1 downto 0);
MUXProxPCEntradaA : in std_logic_vector(DATA_WIDTH-1 downto 0);
MUXProxPCEntradaB : in std_logic_vector(DATA_WIDTH-1 downto 0);
ULActrl : in std_logic_vector(3 downto 0);
zeroFLAG : in std_logic;
escreveC : in std_logic;
MUXPCBEQJUMP : in std_logic;
MUXRTRD : in std_logic;
MUXRTIMED : in std_logic;
MUXULAMEM : in std_logic;
iBEQ : in std_logic;
WR : in std_logic;
RD : in std_logic;
-- Output ports
clkTCL : out std_logic
);
end entity;
architecture arch_name of debugMonitor is
component probesSourcesDebug is
port (
probe : in std_logic_vector(PROBE_WDTH-1 downto 0) := (others => 'X'); -- probe faz a leitura de dados de dentro da FPGA
source : out std_logic -- source escreve dados para dentro da FPGA
);
end component probesSourcesDebug;
begin
probe0 : component probesSourcesDebug
port map (
--probe => sigProbe, -- probes.probe
probe(31 downto 0) => PC,
probe(63 downto 32) => Instrucao,
probe(95 downto 64) => LeituraRS,
probe(127 downto 96) => LeituraRT,
probe(159 downto 128) => EscritaRD,
probe(191 downto 160) => EntradaB_ULA,
probe(223 downto 192) => imediatoEstendido,
probe(255 downto 224) => saidaULA,
probe(287 downto 256) => dadoLido_RAM,
probe(319 downto 288) => proxPC,
probe(351 downto 320) => MUXProxPCEntradaA,
probe(383 downto 352) => MUXProxPCEntradaB,
probe(497 downto 384) => open,
probe(498) => zeroFLAG,
probe(499) => MUXPCBEQJUMP,
probe(500) => MUXRTRD,
probe(501) => MUXRTIMED,
probe(502) => MUXULAMEM,
probe(503) => iBEQ,
probe(504) => WR,
probe(505) => RD,
probe(509 downto 506) => ULActrl,
probe(510) => escreveC,
--probe(PROBE_WDTH-1 downto 256) => open,
source => clkTCL
);
end architecture;
Este trecho de código, deve ser instanciado no top_level do projeto e cada sinal do lado direito deve ser substituido pelo sinal equivalente no projeto em teste.
monitor: work.debugMonitor
port map(PC => PCAtual, -- Saida o PC: entrada de endereco da ROM
Instrucao => FetInstrucao_DecInstrucao, -- Saida de dados da ROM
LeituraRS => Decode_BR_RS_Execute, -- Saida do Banco de Registradores: leitura de RS
LeituraRT => Decode_BR_RT_Execute, -- Saida do Banco de Registradores: leitura de RT
EscritaRD => WB_dadoEscritaC_DEC_DadoEscritaC, -- Entrada do Banco de Registradores (C)
EntradaB_ULA => entradaB_ULA, -- Entrada B da ULA: saida do MUX RT/ImediatoEstendido
imediatoEstendido => Decode_imediatoEstendido_Execute, -- ImediatoEstendido: entrada do MUX RT/ImediatoEstendido
saidaULA => EXEC_endereco_RAM_MEM, -- Saida da ULA: entrada do MUX ULA/MEM
dadoLido_RAM => MEM_dado_Lido_RAM_WB, -- Saida da RAM: entrada do MUX ULA/MEM
proxPC => Fetch_PC_mais_Quatro_Decode, -- Entrada do PC ou saida do MUX ProxPC
MUXProxPCEntradaA => MUXProxPCEntradaA, -- Entrada do MUX ProxPC: vinda MUX PC+4/BEQ
MUXProxPCEntradaB => MUXProxPCEntradaB, -- Entrada do MUX ProxPC: vinda da montagem do endereco de Jump
ULActrl => ULA_CTRL, -- Entrada do ULActrl na ULA: pode ser necessario concatenar 1 bit '0': '0' & ULActrl
zeroFLAG => zFlag, -- Saida do Flag da ULA e entrada da porta AND
escreveC => Decode_escreveC_Decode, -- Entrada do Banco de Registradores: sinal de habilita escrita no terceiro endereco (RD ou RT)
MUXPCBEQJUMP => MUX_PC_BEQ_JUMP, -- Selecao do MUX do proxPC: vem da unidade de controle
MUXRTRD => MUX_RT_RD, -- Selecao do MUX RT/RD: vem da unidade de controle
MUXRTIMED => MUX_RT_IMED, -- Selecao do MUX RT/Imediato: vem da unidade de controle
MUXULAMEM => MUX_ULA_MEM, -- Selecao do MUX ULA/MEM: vem da unidade de controle
iBEQ => BEQ, -- Indicador de instrucao BEQ: vem da unidade de controle
WR => HAB_ESCRITA_MEM, -- Habilita escrita na RAM: vem da unidade de controle
RD => HAB_LEITURA_MEM, -- Habilita leitura da RAM: vem da unidade de controle
--Output
clkTCL => clk_TCL); -- Sem uso: conectar com open
O arquivo qsys é a definição da configuração do probe e deve ser criado no diretório raíz do projeto do Quartus e adicionado ao projeto.
Nome do arquivo: probesSourcesDebug.qsys
<?xml version="1.0" encoding="UTF-8"?>
<system name="$${FILENAME}">
<component
name="$${FILENAME}"
displayName="$${FILENAME}"
version="1.0"
description=""
tags="INTERNAL_COMPONENT=true"
categories="System" />
<parameter name="bonusData"><![CDATA[bonusData
{
element in_system_sources_probes_0
{
datum _sortIndex
{
value = "0";
type = "int";
}
}
}
]]></parameter>
<parameter name="clockCrossingAdapter" value="HANDSHAKE" />
<parameter name="device" value="5CEBA4F23C7" />
<parameter name="deviceFamily" value="Cyclone V" />
<parameter name="deviceSpeedGrade" value="7" />
<parameter name="fabricMode" value="QSYS" />
<parameter name="generateLegacySim" value="false" />
<parameter name="generationId" value="0" />
<parameter name="globalResetBus" value="false" />
<parameter name="hdlLanguage" value="VERILOG" />
<parameter name="hideFromIPCatalog" value="true" />
<parameter name="lockedInterfaceDefinition" value="" />
<parameter name="maxAdditionalLatency" value="1" />
<parameter name="projectName" value="MIPSPCFS.qpf" />
<parameter name="sopcBorderPoints" value="false" />
<parameter name="systemHash" value="0" />
<parameter name="testBenchDutName" value="" />
<parameter name="timeStamp" value="0" />
<parameter name="useTestBenchNamingPattern" value="false" />
<instanceScript></instanceScript>
<interface
name="probes"
internal="in_system_sources_probes_0.probes"
type="conduit"
dir="end">
<port name="probe" internal="probe" />
</interface>
<interface
name="sources"
internal="in_system_sources_probes_0.sources"
type="conduit"
dir="end">
<port name="source" internal="source" />
</interface>
<module
name="in_system_sources_probes_0"
kind="altera_in_system_sources_probes"
version="20.1"
enabled="1"
autoexport="1">
<parameter name="create_source_clock" value="false" />
<parameter name="create_source_clock_enable" value="false" />
<parameter name="device_family" value="Cyclone V" />
<parameter name="gui_use_auto_index" value="true" />
<parameter name="instance_id" value="" />
<parameter name="probe_width" value="511" />
<parameter name="sld_instance_index" value="0" />
<parameter name="source_initial_value" value="0" />
<parameter name="source_width" value="1" />
</module>
<interconnectRequirement for="$system" name="qsys_mm.clockCrossingAdapter" value="HANDSHAKE" />
<interconnectRequirement for="$system" name="qsys_mm.enableEccProtection" value="FALSE" />
<interconnectRequirement for="$system" name="qsys_mm.insertDefaultSlave" value="FALSE" />
<interconnectRequirement for="$system" name="qsys_mm.maxAdditionalLatency" value="1" />
</system>