A continuación se muestra una memoria RAM de un solo puerto en el modo de escritura primero.
module raminfr (clk, we, en, addr, di, do);
input clk;
input we;
input en;
input [4:0] addr;
input [3:0] di;
output [3:0] do;
reg [3:0] RAM [31:0];
reg [4:0] read_addr;
always @(posedge clk)
begin
if (en) begin
if (we)
RAM[addr] <= di;
read_addr <= addr;
end
end
assign do = RAM[read_addr];
endmodule
Aquí, ¿cómo podemos asegurar que la salida do
se modifique después de que se ejecute RAM[addr] <= di;
?
Si la lógica hace el modo de escritura primero, los datos deben escribirse primero y luego la lectura debe suceder. Pero, como sabemos, RAM[addr] <= di;
y r ead_addr <= addr;
se ejecutan simultáneamente. Sin embargo, parece que no podemos garantizar que la salida do
se cambie después de escribir.
¿Por qué funciona este código?
Los siguientes son mis ejemplos:
suposición: addr [10] = 5, addr [20] = 15;
addr anterior: 10, addr actual: 10, en: 1, we: 0 = > do
= 5
addr anterior: 10, addr actual: 20, en: 1, we: 1, di: 12 = >
do
se cambiará debido a que RAM [read_addr] se cambiará a 15. Pero, ¿cómo podemos asegurar que do
será 12 en lugar de 15 (modo de escritura)?
Además, ¿es necesario el reg read_addr
? Si es así, ¿por qué?