【发布时间】:2016-11-03 04:53:16
【问题描述】:
我目前正在构建一个软核处理器,但在合成 Verilog 实现的 RAM 和其他顺序元素时遇到了麻烦。我决定单独处理处理器的每个部分,以了解发生了什么,恐怕还没有运气。我试图合成的电路主要做两件事:用时钟驱动的数据填充内存;内存充满数据后,一个标志将指示向外部处理器发送信号,外部处理器将发送另一个称为就绪的信号,以便读取和存储内存内容。
这些是模块:
顶部模块
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
`
其他模块:
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
即使模拟完美运行,合成也会引发一些警告消息:
警告信息
[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
【问题讨论】:
-
您知道综合会创建硬件,因此如果您用一些常量数据填充内存,而不是从中读取,综合工具将对其进行优化。我真的不明白你在做什么,这不是 HDL,这是 SW 顺序思维。
-
问题是我确实读取了这些数据。 com__out 模块在内存填满后提取此信息,这是用于 FPGA 功能测试。是的,它是顺序的,因为它与时钟信号同步。这是针对处理器的,处理器按顺序工作(除非您使用流水线,我没有使用它,但它们仍然按顺序读取指令)。所以是的,我需要先填充它。他们读取它的内容,因为不应该同时读取和写入内存。
-
内存在 4 个时钟周期内被填满。一旦 fill_mem 模块完成了这个任务,它就会产生一个标志(实际上是一个输出),并将这个信号发送到一些 muxes 和 com_out。现在 com_out 能够提取由信号就绪(FPGA 输入)控制的信息。我打算用微控制器提取这些信息来做一些其他的事情,这就是为什么我也需要它是连续的。
-
但是再一次,如果你认为我做错了,请告诉我应该怎么做。这就是我来这里寻求帮助的原因 n.n
-
仅供参考,您在
com_out中有组合循环。此外always @ (ready)会在模拟和合成电路之间造成功能不匹配。必须指定完整的敏感度列表以避免不匹配,或使用always @*。应为锁存器和触发器分配非阻塞 (<=) 分配,而不是阻塞 (=) 分配。
标签: verilog fpga ram synthesis vivado