Estoy tratando de simular un procesador similar a mips usando verilog. Ya que soy nuevo en verilog, no sé si el diseño es correcto o no. Aquí está el boceto de mi diseño.
Cada elemento de almacenamiento (archivo de registro, memoria de datos, AlusourceA, AluSourceB..etc) se define en un módulo separado junto con la funcionalidad para escribir en ese elemento de almacenamiento. Las señales de control y los datos necesarios, la dirección se proporcionan por referencia jerárquica a otros módulos.
Aquí hay un ejemplo de un módulo que explica claramente mi diseño.
/* top is the main module in this example, all
modules are instantiated in top module. One or more registers are
instantiated in each module which are updated based on the contents
of registers in other modules using hierarchical reference*/
module dat1dat2(input clk,output alusrca,output alusrcb);
reg [7:0] data1,data2; /*Registers which will be cross referenced in
Alu module*/
always @(posedge clk)
begin
if (top.control_unit_uut.en_dat1dat2 and !alusrcb )
/*hierarchical reference to a register in a module instantiated in top
module*/
begin
data1<=top.regfile_uut.regfile[top.IR_uut.IR[12:10]];
data2<=top.IR_uut.IR[6:0];
end
elseif (top.control_unit_uut.en_dat1dat2 and alusrcb)
begin
data1<=top.regfile_uut.regfile[top.IR_uut.IR[12:10]];
data2<=top.regfile_uut.regfile[top.IR_uut.IR[9:7]];
end
else
begin
data1<=8'hzz;
data2<=8'hzz;
end
end
assign alusrca=data1;
assign alusrcb=data2;
endmodule
¿Es este diseño legal en verilog dado que no tengo que sintetizarlo, solo necesito simularlo? Si la respuesta es no, ¿cuál es el diseño más simple que puedo usar que no es sintetizable necesariamente?
PD: Si algo no está claro acerca de mi pregunta, puedo explicarlo en comentarios o actualizar mi pregunta.