An X means a register is not initialized.
You have NOT provided the code for the registers or register banks. Thus the code most likely to cause your problem is missing.
However some of the code you did provide is wrong. This does not work:
always @(posedge reset )
if ( reset )
PC_reset <= 0;
assign PC = PC_reset;
Your "Write to a register" is not using a clock:
// Write to a register
always @(*) begin
RegInputMatrix[WriteAddr] <= 16'b0;
RegInputMatrix[WriteAddr] <= WriteData;
Thus it becomes a latch.
Also that code look suspicious in the reset section. On a reset you only want to clear the register with ...
To chain smaller adders to make larger ones, you need the building-block adders to have carry in and carry out connections and you need to link those connections from one ader to the next.
Your diagram does not match your code, your diagram shows a carry connection, but your code does not.
You need to expand your add16 module to support carry in and out ...
Seems like your file path is causing problem. Specify full file path to .mif file
Anyway Vivado will synthesise only a distributed RAM for your array music. To use Block RAM, you have to generate one with initial values in a .coe file and instantiate it. But then, you can access the data only one at time in a clock cycle. You can't access multiple data in '...