Недавно у меня начались проблемы с ISE.ISE теперь отказывается генерировать поток битов для моего проекта, без ошибок консоли.После дальнейших исследований я обнаружил эту ошибку в отчете о битгенах:
ERROR::102 - The design 'core.ncd' is missing any BMM information for
given BRAM data files. BRAMs can't be initialized with the given data without
BMM information. Either BMM information must be given to NGDBuild with a '-bm'
option, or embedded BMM information must be included in the source HDL.
Я понятия не имею, что это значит, и практически нет полезной информации, которую я мог бы найти где-либо.Я часами рвал на себе волосы, пытаясь решить эту проблему.Поскольку, похоже, что-то связано с инициализацией памяти, я попытался удалить вызовы $ readmemh и $ readmemb, но это не решило проблему.Создание нового проекта и импорт кода также не исправили его.У меня есть другой проект, который генерирует поток битов, но я не делаю ничего другого.
Это может или не быть связано, но у меня также есть проблема с ISim.При запуске симуляции я получаю ошибку «ОШИБКА: слишком много слов, указанных в файле данных IDecoder.mem».Попытка получить доступ к любому из старших кодов операций приводит к неопределенным значениям на шине управления.Я также не уверен, почему это происходит, поскольку в микропрограмме выделено в два раза больше слов, чем определено в IDecoder.mem.
Это неполный проект, части кода не завершены.
core.v:
`timescale 1ns / 1ps
module core(
input clk, rst,
output reg [7:0] leds
);
reg [15:0] dstack [0:63];
reg [15:0] rstack [0:63];
reg [6:0] dstack_ptr = 0, rstack_ptr = 0;
reg [15:0] ins_ptr = 0;
reg [7:0] memory [0:16383];
reg [31:0] microprogram [0:255];
reg [31:0] controlword = 0;
reg [15:0] buffers [0:3];
wire [1:0] buffsel;
assign buffsel = controlword[13:12];
wire [1:0] jumpsel;
assign jumpsel = controlword[16:15];
wire [4:0] aluop;
assign aluop = controlword[21:17];
reg [2:0] mi_counter = 3'd0;
reg pause = 1'd0;
reg halt = 1'd0;
reg [7:0] err = 8'd0;
reg [7:0] opcode = 8'd0;
initial begin
$readmemh("IDecoder.mem", microprogram);
$readmemb("memory.mem", memory);
buffers[0] = 0;
buffers[1] = 0;
buffers[2] = 0;
buffers[3] = 0;
end
always @(negedge clk) begin
if (rst) begin
controlword <= 32'd0;
end else begin
if (!halt && !pause) begin
controlword <= microprogram[{((opcode > 8'd127) ? 8'd128 : opcode), mi_counter}]; //Ignore opcodes > 128
end
end
end
always @(posedge clk) begin
if (rst) begin
opcode <= 0;
ins_ptr <= 0;
dstack_ptr <= 0;
rstack_ptr <= 0;
pause <= 0;
halt <= 0;
mi_counter <= 0;
buffers[0] <= 0;
buffers[1] <= 0;
buffers[2] <= 0;
buffers[3] <= 0;
err <= 0;
leds <= 0;
end else begin
if (controlword[0]) begin //HALT
halt <= 1;
leds <= err;
end
if (controlword[1]) pause <= 1; //PAUSE
if (controlword[2]) mi_counter <= 0; else if (!pause && !halt) mi_counter <= mi_counter + 1; //RST MCC
if (controlword[3]) opcode <= memory[ins_ptr]; //FETCH OPCODE
if (controlword[4]) ins_ptr <= ins_ptr + 1; //IP INC
if (controlword[5]) buffers[buffsel] <= {buffers[buffsel][15:8], memory[ins_ptr]}; //BUFFER FETCH LSB
if (controlword[6]) buffers[buffsel] <= {memory[ins_ptr], buffers[buffsel][7:0]}; //BUFFER FETCH MSB
if (controlword[7]) begin //BUFFER CLEAR
buffers[0] <= 0;
buffers[1] <= 0;
buffers[2] <= 0;
buffers[3] <= 0;
end
if (controlword[8]) begin //BUFFER PUSHD
if (dstack_ptr > 63) begin
halt <= 1;
err <= 1; //DSTACK OVERFLOW
end else begin
dstack[dstack_ptr] <= buffers[buffsel];
dstack_ptr <= dstack_ptr + 1;
end
end
if (controlword[9]) begin //BUFFER PUSHR
if (rstack_ptr > 63) begin
halt <= 1;
err <= 2; //RSTACK OVERFLOW
end else begin
rstack[rstack_ptr] <= buffers[buffsel];
rstack_ptr <= rstack_ptr + 1;
end
end
if (controlword[10]) begin //BUFFER POPD
if (dstack_ptr < 1) begin
halt <= 1;
err <= 3; //DSTACK UNDERFLOW
end else begin
buffers[buffsel] <= dstack[dstack_ptr-1];
dstack_ptr <= dstack_ptr - 1;
end
end
if (controlword[11]) begin //BUFFER POPR
if (rstack_ptr < 1) begin
halt <= 1;
err <= 4; //RSTACK UNDERFLOW
end else begin
buffers[buffsel] <= rstack[rstack_ptr-1];
rstack_ptr <= rstack_ptr - 1;
end
end
//12 & 13 are the buffer select
if (controlword[14]) begin //JUMP
if (buffers[0] > 16383) begin //Invalid jump target
halt <= 1;
err <= 5; //INVALID JUMP ADDRESS
end else begin
case(jumpsel)
3'd0: ins_ptr <= buffers[0]; //Unconditional jump
3'd1: begin //Jump if zero
if (buffers[1] == 0) ins_ptr <= buffers[0];
end
3'd2: begin //Jump if not zero
if (buffers[1] != 0) ins_ptr <= buffers[0];
end
default: begin //Should never happen
halt <= 1;
err <= 255; //UNKNOWN ERROR
end
endcase
end
end
//15 - 16 are the jump select
//17 - 21 are the ALU opcode
if (controlword[22]) begin //ALU
case (aluop)
0: buffers[0] <= buffers[0] + 16'd1; //INC
1: buffers[0] <= buffers[0] - 16'd1; //DEC
2: buffers[0] <= buffers[0] + buffers[1]; //ADD
3: buffers[0] <= buffers[0] - buffers[1]; //SUB
4: buffers[0] <= buffers[0] * buffers[1]; //MUL
5: buffers[0] <= buffers[0] << buffers[1]; //LSHIFT
6: buffers[0] <= buffers[0] >> buffers[1]; //RSHIFT
7: buffers[0] <= ~buffers[0]; //NOT
8: buffers[0] <= buffers[0] & buffers[1]; //AND
9: buffers[0] <= buffers[0] | buffers[1]; //OR
10: buffers[0] <= buffers[0] ^ buffers[1]; //XOR
//COMPARISON OPERATORS
24: buffers[0] <= (buffers[0] <= buffers[1]) ? 16'd1 : 16'd0; //(A LEQ B)
25: buffers[0] <= (buffers[0] >= buffers[1]) ? 16'd1 : 16'd0; //(A GEQ B)
26: buffers[0] <= (buffers[0] < buffers[1]) ? 16'd1 : 16'd0; //(A LT B)
27: buffers[0] <= (buffers[0] > buffers[1]) ? 16'd1 : 16'd0; //(A GT B)
28: buffers[0] <= (buffers[0] != buffers[1]) ? 16'd1 : 16'd0; //(A NEQ B)
29: buffers[0] <= (buffers[0] == buffers[1]) ? 16'd1 : 16'd0; //(A EQ B)
30: buffers[0] <= (buffers[0] != 16'd0) ? 16'd1 : 16'd0; //(A NEQ 0)
31: buffers[0] <= (buffers[0] == 16'd0) ? 16'd1 : 16'd0; //(A EQ 0)
default: buffers[0] <= 16'b0;
endcase
end
end
end
endmodule
memory.mem:
00000010 00000000 //LIT1 0
00011010 //EQ 0
00000001 //HALT
IDecoder.mem:
//OPCODE 0
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 1
00000098
00000001
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 2
00000098
00000030
00000100
00000004
00000004
00000004
00000004
00000004
//OPCODE 3
00000098
00000050
00000030
00000100
00000004
00000004
00000004
00000004
//OPCODE 4
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 5
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 6
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 7
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 8
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 9
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 10
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 11
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 12
00000098
00000050
00000030
00004000
00000004
00000004
00000004
00000004
//OPCODE 13
00000098
00000050
00000030
00001400
0000c000
00000004
00000004
00000004
//OPCODE 14
00000098
00000050
00000030
00001400
00014000
00000004
00000004
00000004
//OPCODE 15
00000098
00000400
00400000
00000100
00000004
00000004
00000004
00000004
//OPCODE 16
00000098
00000400
00420000
00000100
00000004
00000004
00000004
00000004
//OPCODE 17
00000098
00000400
00001400
00440000
00000100
00000004
00000004
00000004
//OPCODE 18
00000098
00000400
00001400
00460000
00000100
00000004
00000004
00000004
//OPCODE 19
00000098
00000400
00001400
00480000
00000100
00000004
00000004
00000004
//OPCODE 20
00000098
00000400
00001400
004a0000
00000100
00000004
00000004
00000004
//OPCODE 21
00000098
00000400
00001400
004c0000
00000100
00000004
00000004
00000004
//OPCODE 22
00000098
00000400
004e0000
00000100
00000004
00000004
00000004
00000004
//OPCODE 23
00000098
00000400
00001400
00500000
00000100
00000004
00000004
00000004
//OPCODE 24
00000098
00000400
00001400
00520000
00000100
00000004
00000004
00000004
//OPCODE 25
00000098
00000400
00001400
00520000
00000100
00000004
00000004
00000004
//OPCODE 26
00000098
00000400
007e0000
00000100
00000004
00000004
00000004
00000004
//OPCODE 27
00000098
00000400
007c0000
00000100
00000004
00000004
00000004
00000004
//OPCODE 28
00000098
00000400
00001400
007a0000
00000100
00000004
00000004
00000004
//OPCODE 29
00000098
00000400
00001400
00780000
00000100
00000004
00000004
00000004
//OPCODE 30
00000098
00000400
00001400
00760000
00000100
00000004
00000004
00000004
//OPCODE 31
00000098
00000400
00001400
00740000
00000100
00000004
00000004
00000004
//OPCODE 32
00000098
00000400
00001400
00720000
00000100
00000004
00000004
00000004
//OPCODE 33
00000098
00000400
00001400
00700000
00000100
00000004
00000004
00000004
//OPCODE 34
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 35
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 36
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 37
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 38
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 39
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 40
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 41
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 42
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 43
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 44
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 45
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 46
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 47
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 48
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 49
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 50
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 51
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 52
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 53
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 54
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 55
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 56
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 57
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 58
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 59
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 60
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 61
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 62
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 63
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 64
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 65
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 66
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 67
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 68
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 69
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 70
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 71
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 72
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 73
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 74
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 75
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 76
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 77
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 78
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 79
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 80
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 81
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 82
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 83
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 84
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 85
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 86
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 87
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 88
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 89
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 90
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 91
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 92
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 93
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 94
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 95
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 96
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 97
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 98
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 99
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 100
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 101
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 102
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 103
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 104
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 105
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 106
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 107
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 108
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 109
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 110
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 111
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 112
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 113
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 114
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 115
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 116
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 117
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 118
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 119
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 120
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 121
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 122
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 123
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 124
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 125
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 126
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 127
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
//OPCODE 128
00000098
00000004
00000004
00000004
00000004
00000004
00000004
00000004
coretest.v:
`масштаб времени 1 нс / 1ps
module coretest;
// Inputs
reg clk;
reg rst;
// Outputs
wire [7:0] leds;
integer i=0;
// Instantiate the Unit Under Test (UUT)
core uut (
.clk(clk),
.rst(rst),
.leds(leds)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
// Wait 100 ns for global reset to finish
#100;
while (i < 10000) begin
clk = !clk;
#5;
end
end
endmodule