izumizawa / mc851

Projeto com objetivo de desenvolver um sistema computacional contendo, ao menos, um processador e seus componentes periféricos.
5 stars 0 forks source link

Valores sendo usados sequencialmente não são corretamente atribuídos no `cpu.v` #14

Open paulopacitti opened 1 year ago

paulopacitti commented 1 year ago

Conversando com o professor, notamos que muitos dos valores atribuídos em blocos always não tem o funcionamento correto. Isso acontece porque em HDLs, no nosso caso o Verilog, as atribuições são apenas feitas do anterior para o próximo, mas não para valores seguintes. Em hardware, a cada mudança de sinal, um código de feed-forward é executado, e não comandos sequenciais.

Exemplo:

always @(posedge clk) begin
   b <= a;
   c <= b;
end

O que realmente acontece é que c= b_clock_anterior e b = a. Para arrumar isso, pode ser utilizado diretamente c <= a ou o uso de instruções assign fora dos blocos always.

MUITOS pedaços de código no cpu.v estão dessa forma, e precisamos consertar isso gradualmente senão o código não será corretamente sintetizado.

paulopacitti commented 1 year ago

Detalhe: a mmu não possuí esses erros pois o @daniel-pg já havia notado tal comportamento, os testes funcionam como o esperado. Mas a cpu.v possui vários desses problemas.

paulopacitti commented 1 year ago

Uma forma de consertar isso, é gerar os sinais internos do estágio com o assign, fora do bloco always, e utilizar condicionais if e case necessárias dentro dos blocos always