Vivado 2016.1:综合后,它正在删除有用的逻辑。 verilog
Vivado 2016.1: Upon synthesis it is removing useful logic. Verilog
我目前正在构建一个软核处理器,但在合成 Verilog 实现的 RAM 和其他时序元素时遇到了问题。我决定在处理器的每个部分单独工作,以找出发生了什么,恐怕还没有运气。我尝试合成的电路主要做两件事:用时钟驱动的数据填充内存;内存充满数据后,标志将指示向外部处理器发送信号,外部处理器将发送另一个称为就绪的信号,以读取和存储内存内容。
这些是模块:
TOP MODULE
module DATATEST(clk,JRED,led,jd,ja);
input clk;
input JRED;
output [1:0] led;
output [7:0] ja;
output [1:0] jd;
wire RESP,FLAG,RDY,SENT,CL;
wire [7:0] DATA;
wire BFLAG, BCL,BFL,BL;
wire WD;
wire [31:0] MR,MW,FAD,LAD,AD;
assign CL = clk;
assign RDY = JRED;
assign led[0] = BL;
assign led[1] = SENT;
assign ja = DATA;
assign jd[0] = RESP;
assign jd[1] = FLAG;
fill_mem FM1(.clock(BCL),.flag(FLAG),.out(MW),.ad(FAD));
not_gate NG1(.I(BFLAG),.O(WD));
mux MUX1(.a(FAD),.b(LAD),.c(BFL),.o(AD));
data_memory DM1(.address(AD),.wr_da(MW),.mem_write(WD),.mem_read(FLAG),.re_da(MR));
com_out CM1(.ready(RDY),.flag(BFL),.in(MR),.out(DATA),.sent(SENT),.response(RESP),
.address(LAD));
buffer F1(.in(FLAG),.out(BFLAG));
buffer F2(.in(FLAG),.out(BFL));
buffer F3(.in(FLAG),.out(BL));
buffer C1(.in(CL),.out(BCL));
endmodule
`
OTHER MODULES:
module data_memory(address,wr_da,mem_write,mem_read,re_da);
parameter SIZE = 16;
input [31:0] address;
input [31:0] wr_da;
input mem_write;
input mem_read;
output [31:0] re_da;
reg [7:0] MEM [0:SIZE-1];
assign re_da = (mem_read == 1) ? {MEM[address],MEM[address+1],MEM[address+2],MEM[address+3]}:0 ;
always @ (wr_da, address)
begin
if (mem_write == 1)
begin
MEM[address] = wr_da[31:24];
MEM[address+1] = wr_da[23:16];
MEM[address+2] = wr_da[15:8];
MEM[address+3] = wr_da[7:0];
end
end
module mux(a,b,c,o);
parameter N = 32;
input [N-1:0] a;
input [N-1:0] b;
input c;
output reg [N-1:0] o = 0;
always @*
begin
o = 0;
case (c)
0: o = a;
1: o = b;
default: o = 0;
endcase
end
endmodule
module com_out(ready,flag,in,out,sent,response,address);
input ready;
input flag;
input [31:0] in;
output reg [7:0] out;
output reg sent;
output reg [31:0] address = 0;
output response;
reg SINT = 0;
reg COUNT = 0;
reg R = 0;
reg [15:0] SEND = 0;
wire [7:0] DATA [3:0];
assign DATA[0] = in[31:24];
assign DATA[1] = in[23:16];
assign DATA[2] = in[15:8];
assign DATA[3] = in[7:0];
assign response = (R == 1) ? 1:0;
always @ (ready)
begin
out = 0;
if (ready == 1)
begin
if ((flag==1) && (SINT==0))
begin
out = DATA[SEND];
R = 1;
SEND = SEND+1;
if (SEND==4)
begin
address = address + 4;
SEND = 0;
COUNT = COUNT + 1;
end
else
address = address;
end
else
out = 0;
end
else
R = 0;
if (COUNT == 4)
begin
sent = 1;
SINT = 1;
end
else
begin
sent = 0;
SINT = 0;
end
end
endmodule
module fill_mem (clock,flag,out,ad);
input clock;
output reg flag = 0;
output reg [31:0] out = 0;
output [31:0] ad ;
reg [31:0] COMP = 0;
reg [31:0] COND = 0;
assign ad = COND;
always @ (negedge clock)
begin
COMP = COMP + 4;
COND = COMP - 4;
case (COND)
0 : out = 32'hACDECACA;
4 : out = 32'hACAFECAD;
8: out = 32'hCAFEBEEF;
12: out = 32'hDEADCAFE;
default: out = 0;
endcase
if (COMP >= 20)
flag = 1;
else
flag = 0;
end
endmodule
即使模拟工作完美,合成也会抛出一些警告消息:
WARNING MESSAGES
[Synth 8-3332] Sequential element (FM1/out_reg[31]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[27]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[26]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[25]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[24]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[23]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[20]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[19]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[18]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[11]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[10]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[9]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[7]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[5]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[4]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[2]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[1]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COND_reg[0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[0][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[1][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[2][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[3][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[4][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[5][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[6][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[7][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[8][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[9][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[10][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[11][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[12][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[13][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[14][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[15][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COMP_reg[0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COMP_reg[1]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COND_reg[1]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[8]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[0][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[2][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[4][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[6][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[8][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[10][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[12][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[14][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (CM1/address_reg[0]) is unused and will be removed from module DATATEST.
我希望我能理解为什么,因为所有的元素都被实际使用了。
所以,如果能帮我弄清楚问题是什么以及如何解决,我将不胜感激。提前致谢 :D T.T
为了防止合成器删除 "unused" 逻辑,我在声明我想保留的变量之前使用了这个语句:
EXAMPLE:
(*dont_touch = "true"*) output reg [7:0] out;
(*dont_touch = "true"*) reg COUNT = 0;
......
感谢那些不厌其烦地尝试详细说明我不太理解的事情的人。
代码现在可以完美运行了。我在某些事情上使用了 don_touch,修改了 RAM 上的一些代码,并决定制作不同的输出和 TOP 模块,以实现在 FPGA 上进行测试的更简单方法。基本上,fill_mem 模块用数据填充内存(顾名思义),然后内存由另一个模块读取,该模块被带到板上的一些 LED,可以检查存储的字节。读取地址用开关选择。
TOP MODULE
module RAM_LEDS( clk, sw, led,lr,lb);
input clk;
input [3:0] sw;
output [3:0] led;
output [3:0] lr;
output [0:0] lb;
wire FLAG;
wire [3:0] EXT;
wire WD;
wire [31:0] MR,MW;
wire [4:0] RESU, A/*,B*/,FAD,LAD,AD,TA;
wire [7:0] LO;
assign led = LO[3:0];
assign lr = LO[7:4];
assign lb[0] = FLAG;
assign EXT = sw;
fill_mem FM1(.a(A),.out(MW),.ad(FAD));
adder_oi #(5) A1(.p(A),.result(RESU));
not_gate NG1(.I(FLAG),.O(WD));
mux #(5) MUX1(.a(FAD),.b(LAD),.c(FLAG),.o(AD));
bus #(5) B1(.clk(clk),.I(RESU),.O(A));
data_memory DM1(.clock(clk),.address(AD),.wr_da(MW),.mem_write(WD),.mem_read(FLAG),.re_da(MR));
peripheral P1(.a(FAD),.flag(FLAG));
extend EX1(.I(EXT),.O(TA));
switching S1(.ai(TA),.data(MR),.leds(LO),.ao(LAD));
endmodule
Instantiated Modules
HW 用于从 RAM 读取
module peripheral(a,flag);
parameter A = 5;
input [A-1:0] a;
output flag;
assign flag = (a == 20) ? 1:0;
assign flag = (a == 20) ? 1:0;
endmodule
module extend(I,O);
input [3:0] I;
output [4:0] O;
assign O = {1'b0,I};
endmodule
module switching(ai,data,leds,ao);
input [4:0] ai;
input [31:0] data;
output reg [7:0] leds;
output reg [4:0] ao;
wire [7:0] D [0:3];
assign D[0] = data[7:0];
assign D[1] = data[15:8];
assign D[2] = data[23:16];
assign D[3] = data[31:24];
always @*
begin
case (ai)
0,1,2,3: ao = 0;
4,5,6,7: ao = 4;
8,9,10,11: ao = 8;
12,13,14,15: ao = 12;
default: ao = 0;
endcase
leds = D[ai%4];
end
endmodule
用于填充 RAM 的硬件
module fill_mem (a,out,ad);
parameter A = 5;
input [A-1:0] a;
output [31:0] out;
output [A-1:0] ad;
(* dont_touch = "true" *) reg [31:0] O = 0;
(* dont_touch = "true" *) reg [A-1:0] AR = 0;
assign out = O;
assign ad = AR;
always @*
begin
case (a)
0: begin AR = 0; O = 32'h00000000;; end
4: begin AR = 4; O = 32'hFFF00F00; end
8: begin AR = 8; O = 32'h9669C33C; end
12: begin AR = 12; O = 32'hF173371F; end
16: begin AR = 16; O = 32'hFFFFFFFF; end
default: begin AR = 20; O = 0; end
endcase
end
endmodule
module bus(clk,I,O);
parameter N = 32;
input clk;
input [N-1:0] I;
output [N-1:0] O;
(* dont_touch = "true" *)reg [N-1:0] C = 0;
assign O = C;
always @(posedge clk)
begin
C = I;
end
endmodule
module adder_oi(p,result); //PC+4
parameter N =32;
input [N-1:0] p;
output [N-1:0] result;
assign result = p + 4;
endmodule
杂项
module mux(a,b,c,o);
parameter N = 32;
input [N-1:0] a;
input [N-1:0] b;
input c;
output reg [N-1:0] o = 0;
always @*
begin
o = 0;
case (c)
0: o = a;
1: o = b;
default: o = 0;
endcase
end
endmodule
DA RAM 本身
module data_memory(clock,address,wr_da,mem_write,mem_read,re_da);
parameter SIZE = 24;
parameter A = 5;
input [A-1:0] address;
input clock;
input [31:0] wr_da;
input mem_write;
input mem_read;
output [31:0] re_da;
(* ram_style = "auto" *) reg [31:0] MEM [0:SIZE-1];
assign re_da = (mem_read) ? MEM[address]:0;
always @(negedge clock)
begin
if ((mem_write) &&(!mem_read))
begin
MEM[address] <= wr_da;
end
end
endmodule
就是这样。现在唯一剩下的就是测试完整的处理器。
我目前正在构建一个软核处理器,但在合成 Verilog 实现的 RAM 和其他时序元素时遇到了问题。我决定在处理器的每个部分单独工作,以找出发生了什么,恐怕还没有运气。我尝试合成的电路主要做两件事:用时钟驱动的数据填充内存;内存充满数据后,标志将指示向外部处理器发送信号,外部处理器将发送另一个称为就绪的信号,以读取和存储内存内容。
这些是模块:
TOP MODULE
module DATATEST(clk,JRED,led,jd,ja);
input clk;
input JRED;
output [1:0] led;
output [7:0] ja;
output [1:0] jd;
wire RESP,FLAG,RDY,SENT,CL;
wire [7:0] DATA;
wire BFLAG, BCL,BFL,BL;
wire WD;
wire [31:0] MR,MW,FAD,LAD,AD;
assign CL = clk;
assign RDY = JRED;
assign led[0] = BL;
assign led[1] = SENT;
assign ja = DATA;
assign jd[0] = RESP;
assign jd[1] = FLAG;
fill_mem FM1(.clock(BCL),.flag(FLAG),.out(MW),.ad(FAD));
not_gate NG1(.I(BFLAG),.O(WD));
mux MUX1(.a(FAD),.b(LAD),.c(BFL),.o(AD));
data_memory DM1(.address(AD),.wr_da(MW),.mem_write(WD),.mem_read(FLAG),.re_da(MR));
com_out CM1(.ready(RDY),.flag(BFL),.in(MR),.out(DATA),.sent(SENT),.response(RESP),
.address(LAD));
buffer F1(.in(FLAG),.out(BFLAG));
buffer F2(.in(FLAG),.out(BFL));
buffer F3(.in(FLAG),.out(BL));
buffer C1(.in(CL),.out(BCL));
endmodule
`
OTHER MODULES:
module data_memory(address,wr_da,mem_write,mem_read,re_da);
parameter SIZE = 16;
input [31:0] address;
input [31:0] wr_da;
input mem_write;
input mem_read;
output [31:0] re_da;
reg [7:0] MEM [0:SIZE-1];
assign re_da = (mem_read == 1) ? {MEM[address],MEM[address+1],MEM[address+2],MEM[address+3]}:0 ;
always @ (wr_da, address)
begin
if (mem_write == 1)
begin
MEM[address] = wr_da[31:24];
MEM[address+1] = wr_da[23:16];
MEM[address+2] = wr_da[15:8];
MEM[address+3] = wr_da[7:0];
end
end
module mux(a,b,c,o);
parameter N = 32;
input [N-1:0] a;
input [N-1:0] b;
input c;
output reg [N-1:0] o = 0;
always @*
begin
o = 0;
case (c)
0: o = a;
1: o = b;
default: o = 0;
endcase
end
endmodule
module com_out(ready,flag,in,out,sent,response,address);
input ready;
input flag;
input [31:0] in;
output reg [7:0] out;
output reg sent;
output reg [31:0] address = 0;
output response;
reg SINT = 0;
reg COUNT = 0;
reg R = 0;
reg [15:0] SEND = 0;
wire [7:0] DATA [3:0];
assign DATA[0] = in[31:24];
assign DATA[1] = in[23:16];
assign DATA[2] = in[15:8];
assign DATA[3] = in[7:0];
assign response = (R == 1) ? 1:0;
always @ (ready)
begin
out = 0;
if (ready == 1)
begin
if ((flag==1) && (SINT==0))
begin
out = DATA[SEND];
R = 1;
SEND = SEND+1;
if (SEND==4)
begin
address = address + 4;
SEND = 0;
COUNT = COUNT + 1;
end
else
address = address;
end
else
out = 0;
end
else
R = 0;
if (COUNT == 4)
begin
sent = 1;
SINT = 1;
end
else
begin
sent = 0;
SINT = 0;
end
end
endmodule
module fill_mem (clock,flag,out,ad);
input clock;
output reg flag = 0;
output reg [31:0] out = 0;
output [31:0] ad ;
reg [31:0] COMP = 0;
reg [31:0] COND = 0;
assign ad = COND;
always @ (negedge clock)
begin
COMP = COMP + 4;
COND = COMP - 4;
case (COND)
0 : out = 32'hACDECACA;
4 : out = 32'hACAFECAD;
8: out = 32'hCAFEBEEF;
12: out = 32'hDEADCAFE;
default: out = 0;
endcase
if (COMP >= 20)
flag = 1;
else
flag = 0;
end
endmodule
即使模拟工作完美,合成也会抛出一些警告消息:
WARNING MESSAGES
[Synth 8-3332] Sequential element (FM1/out_reg[31]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[27]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[26]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[25]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[24]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[23]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[20]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[19]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[18]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[11]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[10]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[9]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[7]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[5]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[4]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[2]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[1]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COND_reg[0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[0][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[1][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[2][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[3][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[4][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[5][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[6][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[7][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[8][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[9][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[10][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[11][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[12][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[13][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[14][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[15][3]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COMP_reg[0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COMP_reg[1]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/COND_reg[1]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (FM1/out_reg[8]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[0][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[2][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[4][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[6][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[8][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[10][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[12][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (DM1/MEM_reg[14][0]) is unused and will be removed from module DATATEST.
[Synth 8-3332] Sequential element (CM1/address_reg[0]) is unused and will be removed from module DATATEST.
我希望我能理解为什么,因为所有的元素都被实际使用了。
所以,如果能帮我弄清楚问题是什么以及如何解决,我将不胜感激。提前致谢 :D T.T
为了防止合成器删除 "unused" 逻辑,我在声明我想保留的变量之前使用了这个语句:
EXAMPLE:
(*dont_touch = "true"*) output reg [7:0] out;
(*dont_touch = "true"*) reg COUNT = 0;
......
感谢那些不厌其烦地尝试详细说明我不太理解的事情的人。
代码现在可以完美运行了。我在某些事情上使用了 don_touch,修改了 RAM 上的一些代码,并决定制作不同的输出和 TOP 模块,以实现在 FPGA 上进行测试的更简单方法。基本上,fill_mem 模块用数据填充内存(顾名思义),然后内存由另一个模块读取,该模块被带到板上的一些 LED,可以检查存储的字节。读取地址用开关选择。
TOP MODULE
module RAM_LEDS( clk, sw, led,lr,lb);
input clk;
input [3:0] sw;
output [3:0] led;
output [3:0] lr;
output [0:0] lb;
wire FLAG;
wire [3:0] EXT;
wire WD;
wire [31:0] MR,MW;
wire [4:0] RESU, A/*,B*/,FAD,LAD,AD,TA;
wire [7:0] LO;
assign led = LO[3:0];
assign lr = LO[7:4];
assign lb[0] = FLAG;
assign EXT = sw;
fill_mem FM1(.a(A),.out(MW),.ad(FAD));
adder_oi #(5) A1(.p(A),.result(RESU));
not_gate NG1(.I(FLAG),.O(WD));
mux #(5) MUX1(.a(FAD),.b(LAD),.c(FLAG),.o(AD));
bus #(5) B1(.clk(clk),.I(RESU),.O(A));
data_memory DM1(.clock(clk),.address(AD),.wr_da(MW),.mem_write(WD),.mem_read(FLAG),.re_da(MR));
peripheral P1(.a(FAD),.flag(FLAG));
extend EX1(.I(EXT),.O(TA));
switching S1(.ai(TA),.data(MR),.leds(LO),.ao(LAD));
endmodule
Instantiated Modules
HW 用于从 RAM 读取
module peripheral(a,flag);
parameter A = 5;
input [A-1:0] a;
output flag;
assign flag = (a == 20) ? 1:0;
assign flag = (a == 20) ? 1:0;
endmodule
module extend(I,O);
input [3:0] I;
output [4:0] O;
assign O = {1'b0,I};
endmodule
module switching(ai,data,leds,ao);
input [4:0] ai;
input [31:0] data;
output reg [7:0] leds;
output reg [4:0] ao;
wire [7:0] D [0:3];
assign D[0] = data[7:0];
assign D[1] = data[15:8];
assign D[2] = data[23:16];
assign D[3] = data[31:24];
always @*
begin
case (ai)
0,1,2,3: ao = 0;
4,5,6,7: ao = 4;
8,9,10,11: ao = 8;
12,13,14,15: ao = 12;
default: ao = 0;
endcase
leds = D[ai%4];
end
endmodule
用于填充 RAM 的硬件
module fill_mem (a,out,ad);
parameter A = 5;
input [A-1:0] a;
output [31:0] out;
output [A-1:0] ad;
(* dont_touch = "true" *) reg [31:0] O = 0;
(* dont_touch = "true" *) reg [A-1:0] AR = 0;
assign out = O;
assign ad = AR;
always @*
begin
case (a)
0: begin AR = 0; O = 32'h00000000;; end
4: begin AR = 4; O = 32'hFFF00F00; end
8: begin AR = 8; O = 32'h9669C33C; end
12: begin AR = 12; O = 32'hF173371F; end
16: begin AR = 16; O = 32'hFFFFFFFF; end
default: begin AR = 20; O = 0; end
endcase
end
endmodule
module bus(clk,I,O);
parameter N = 32;
input clk;
input [N-1:0] I;
output [N-1:0] O;
(* dont_touch = "true" *)reg [N-1:0] C = 0;
assign O = C;
always @(posedge clk)
begin
C = I;
end
endmodule
module adder_oi(p,result); //PC+4
parameter N =32;
input [N-1:0] p;
output [N-1:0] result;
assign result = p + 4;
endmodule
杂项
module mux(a,b,c,o);
parameter N = 32;
input [N-1:0] a;
input [N-1:0] b;
input c;
output reg [N-1:0] o = 0;
always @*
begin
o = 0;
case (c)
0: o = a;
1: o = b;
default: o = 0;
endcase
end
endmodule
DA RAM 本身
module data_memory(clock,address,wr_da,mem_write,mem_read,re_da);
parameter SIZE = 24;
parameter A = 5;
input [A-1:0] address;
input clock;
input [31:0] wr_da;
input mem_write;
input mem_read;
output [31:0] re_da;
(* ram_style = "auto" *) reg [31:0] MEM [0:SIZE-1];
assign re_da = (mem_read) ? MEM[address]:0;
always @(negedge clock)
begin
if ((mem_write) &&(!mem_read))
begin
MEM[address] <= wr_da;
end
end
endmodule
就是这样。现在唯一剩下的就是测试完整的处理器。