Testando o banco de registradores do RISC-V
O objetivo desta simulação é escrever um test bench para testar o banco de registradores do RISC-V. Ele possui duas portas de leitura (1 e 2) e uma de escrita (3), totalmente independentes. Para fazer as leituras, são informados os endereços ra1 e ra2 (r*ead address) e retornam os valores rd1 e rd2 (read data) respectivamente. A escrita é síncrona na subida do clk, para a qual é necessário informar o endereço desejado em wa3 (write address), o dado a ser gravado em wd3 (write data) e ainda habilitar a escrita we3 (write e*nable). Sua descrição em Verilog está a seguir (note que a questão do registrador $zero é tratada nas leituras e não na escrita):
O teste consiste em escrever uma sequência de palavras fornecida nos registradores de $x1 a $x8 e enquanto as lê de volta, respeitando as seguintes regras:
1. Todos os endereços e dados só devem ser modificados nas bordas de descida do clk;
1. O write enable só pode ser ativado durante escritas válidas;
1. Na porta 2 é lido o mesmo registrador da escrita (note que o valor troca no momento da subida do clk);
1. Na porta 1 é lido o registrador anterior, gravado um ciclo antes (note que o registrador zero já tem o valor definido);
1. Os demais registradores, que não forem escritos, permanecem indefinidos.

Você pode informar cada estímulo manualmente ou automatizar com um loop for ou ainda a cada @(negedge clk).