Altifigence Academy

25 / 63 · Prática

Prática: teste exaustivo do MUX e análise da saída registrada

Aplique as mesmas entradas aos caminhos combinacional e registrado e verifique pela tabela-verdade e pelos instantes de captura.

Circuito e condições de observação

Com sel=0, y recebe a; com sel=1, recebe b. sampled_y armazena y na borda de subidaBorda de subida Instante em que o clock passa de 0 para 1. É diferente do nível alto, que abrange todo o intervalo com CLK=1. Saiba mais e se mantém até a próxima, mesmo que as entradas mudem.

Antes de começar

Prepare um projeto Desktop do Digital Design Studio e as permissões necessárias para executá-lo. Salve cada exemplo como rtl/top.sv em uma pasta independente.

Primeiro faça a e b diferentes. Confira se sel=0 seleciona a e sel=1 seleciona b e compare cada linha do arquivo de entradas.

Mude diretamente o caminho selecionado

y = sel ? b : a

Código SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic a,
    input logic b,
    input logic sel,
    output logic y,
    output logic sampled_y
);
    assign y = sel ? b : a;
    // Explicit observation register: y remains purely combinational.
    // The register makes this design eligible for logic-netlist-1 simulation.
    always_ff @(posedge clk) sampled_y <= y;
endmodule

Execução

Em New analysis, selecione Two-state single-clock v1. Configure Clock port como clk e o período como 1000ps. Com os valores abaixo, execute Preflight e depois Run RTL simulation; compare os resultados.

ConfiguraçãoValor
Valores iniciais dos registradores, a partir do LSB[false]
Reset portVazio
Maximum cycles / time8 / 8000ps

Cada coluna representa uma entrada do arquivo abaixo. A y combinacional esperada é 0,0,0,1,1,0,1,1. A figura prevê a função na ordem das entradas; não mostra quando sampled_y é atualizado.

As oito combinações do JSON de entrada
Ver os dados da forma de onda
Dados da forma de onda: cada caractere é um intervalo; um ponto mantém o estado anterior; p representa um ciclo de clock.
SinalForma de ondaValores do barramento
a0...1...
b0.1.0.1.
sel01010101
y esperado0..1.01.

Estímulos de entrada

json
[
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        false
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        false
      ],
      "sel": [
        true
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        false
      ]
    }
  },
  {
    "inputs": {
      "a": [
        true
      ],
      "b": [
        true
      ],
      "sel": [
        true
      ]
    }
  }
]

Comparação dos resultados

8 cycles · y=1 · sampled_y=1. Confira se, em 3000ps, y=1 e sampled_y=0.

Esta prática usa RTL 0/1 de um único clock, sem testbenches com #delay, initial ou X/Z. Marcar a aula como concluída é um registro de aprendizagem, não um resultado real de simulação.

Escreva primeiro os resultados esperados

Antes de executar, calcule y para a sequência dada: 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1. São verificadas as oito combinações possíveis, evidência mais forte do que acertar apenas o valor final.

A saída do registradorRegistrador Circuito que armazena vários bits de estado. Os registradores síncronos deste curso capturam a entrada especificada na borda de clock. Saiba mais muda na borda de subida, não ao aplicar um estímulo. Anote separadamente y logo antes da borda e a saída registrada logo depois.

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

As entradas capturadas em k definem o estado posterior qk+1q_{k+1}, chamado sampled_y. Mesmo que compartilhem a coordenada temporal, confira a ordem da aplicação das entradas e da atualização do registrador.

Três verificações para distinguir os defeitos

  1. Seleção invertida: antes de mudar para sel ? a : b, preveja o primeiro vetor que falha. Vetores com a=ba=b não detectam esse erro.
  2. Confusão no ponto de observação: explique por que comparar imediatamente sampled_y, em vez de y, com a referência combinacional pode reprovar um circuito correto.
  3. Manutenção diante de entradas não selecionadas: mude apenas a entrada não escolhida e confira se y é mantido. Se a escolhida mudar, y deve acompanhá-la.

Registre, para cada falha, entrada, instante, valor esperado e valor real. «A forma de onda está estranha» não distingue erro de seleção de latência de um ciclo.

Ampliação

Com dados de quatro bits, o espaço combinacional é 24+4+1=5122^{4+4+1}=512. Ainda é viável testar tudo, mas use primeiro 0, máximo, 0101, 1010 e padrões walking-one para revelar erros de posição. Atualize também configuração e arquivo de entradas para a nova largura.

Experimente

Após capturar a=0,b=1,s=0a=0,b=1,s=0 numa borda de subida, apenas ss muda para 1 antes da próxima. Calcule yy após o atraso lógico e sampled_y antes e depois da próxima borda.

Ler a explicação

A saída combinacional é y=1y=1. sampled_y mantém 0 até a próxima borda de subida e nela captura 1. Pressupõe-se que as entradas fiquem estáveis pelo tempo necessário à captura.

Lesson files

mux-top.sv ↓mux-inputs.json ↓

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.