Altifigence Academy

6 / 37 · Conceito

Índices de vetor, ordem de bits e sinal

Distinga índices, ordem de transmissão serial e interpretação aritmética ao ler caminhos de dados.

O índice é um nome; a declaração define o sentido

Em logic [7:0] a;, a[7] é a posição à esquerda. Em logic [0:7] b;, é b[0]. Ao atribuir 8'h96, ambos mostram 10010110 da esquerda para a direita, mas com índices diferentes. Só se pode pressupor «bit 0 é o LSBLSB Bit de menor peso. É preciso conferir em conjunto o sentido da notação e as regras de indexação.» depois de conferir a declaração.

Manter um sentido consistente em toda a interface facilita revisões. Especifique também a ordem exibida pela ferramenta de ondas e a dos vetores do arquivo. O JSON do curso enumera bits a partir do LSB; os vetores RTL geralmente são lidos a partir do MSBMSB Bit de maior peso. Seu índice depende do sentido de declaração do vetor; não se deve supor que sempre tenha o maior número..

Confira a direção pelas conexões

Em q <= {q[1:0], din};, o próximo q[2] recebe o antigo q[1], q[1] recebe o antigo q[0] e q[0] recebe din.

q2next=q1,q1next=q0,q0next=dq_2^{next}=q_1,\quad q_1^{next}=q_0,\quad q_0^{next}=d

A especificação precisa diz qual índice recebe qual sinal, não para que lado a seta foi desenhada.

As setas indicam as posições de armazenamento percorridas. Todos os registradoresRegistrador Circuito que armazena vários bits de estado. Os registradores síncronos deste curso capturam a entrada especificada na borda de clock. Saiba mais leem valores anteriores na mesma borda; din não atravessa até q2 numa única borda.

Leia o caminho de deslocamento pelos índices
  1. din: Bit aceito nesta borda
  2. q0: Capture din
  3. q1: Capture o q0 anterior
  4. q2: Capture o q1 anterior

Deslocamento aritmético e lógico

>> desloca logicamente à direita e preenche com 0 as posições vagas da esquerda, as mais significativas. >>> permite deslocamento aritmético com extensão de sinal quando o operando esquerdo é signed. Os mesmos bits podem produzir resultados diferentes conforme essa declaração.

SystemVerilog
logic signed [7:0] x;
logic [7:0] logical_right, arithmetic_right;
assign logical_right = x >> 1;
assign arithmetic_right = x >>> 1;

Com x=8'b11111000 (-8), os resultados são 01111100 e 11111100. O deslocamento aritmético de negativos nem sempre coincide com o arredondamento de uma divisão inteira negativa: confira isso ao projetar algoritmos numéricos.

Experimente

Para q=101 de três bits e din=0, calcule o próximo valor de q<={q[1:0],din} e q<={din,q[2:1]}.

Ler a explicação

Ambas dão 010: para essa entrada, as direções coincidem por acaso. Com q=001 e din=0, dão 010 e 000, distinguindo o erro de direção.

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