|  | 
 
| 
 
在SDRAM controller 里碰到一个dual port RAM, 仿真可以通过,但无法综合。
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 仿真器:iverilog + vvp
 综合报错如下:
 dpram_generic.v:23: Net 'mem3[7][7]' or a directly connected net is driven by more than one source, and not all drivers are three-state. (ELAB-366)
 
 有什么办法解决吗?
 
 这是开源项目wb_sdram_ctrl里的dual port ram。
 
 dpram_generic.v:
 
 module dpram_generic #(
 
 parameter ADDR_WIDTH = 3
 )
 (
 
 input
 clk_a,
 
 input  [ADDR_WIDTH-1:0]
 addr_a,
 
 input  [3:0]
 we_a,
 
 input  [31:0]
 di_a,
 
 output reg [31:0]
 do_a,
 
 
 input
 clk_b,
 
 input  [ADDR_WIDTH-1:0]
 addr_b,
 
 input  [3:0]
 we_b,
 
 input  [31:0]
 di_b,
 
 output reg [31:0]
 do_b
 );
 
 
 reg [7:0]
 mem0[(1<<ADDR_WIDTH)-1:0];
 
 reg [7:0]
 mem1[(1<<ADDR_WIDTH)-1:0];
 
 reg [7:0]
 mem2[(1<<ADDR_WIDTH)-1:0];
 
 reg [7:0]
 mem3[(1<<ADDR_WIDTH)-1:0];
 
 
 always @(posedge clk_a) begin
 
 if (we_a[3])
 
 mem3[addr_a] <= di_a[31:24];
 
 if (we_a[2])
 
 mem2[addr_a] <= di_a[23:16];
 
 if (we_a[1])
 
 mem1[addr_a] <= di_a[15:8];
 
 if (we_a[0])
 
 mem0[addr_a] <= di_a[7:0];
 
 do_a <= {mem3[addr_a], mem2[addr_a],
 
 mem1[addr_a], mem0[addr_a]};
 
 end
 
 
 always @(posedge clk_b) begin
 
 if (we_b[3])
 
 mem3[addr_b] <= di_b[31:24];
 
 if (we_b[2])
 
 mem2[addr_b] <= di_b[23:16];
 
 if (we_b[1])
 
 mem1[addr_b] <= di_b[15:8];
 
 if (we_b[0])
 
 mem0[addr_b] <= di_b[7:0];
 
 do_b <= {mem3[addr_b], mem2[addr_b],
 
 mem1[addr_b], mem0[addr_b]};
 
 end
 endmodule
 | 
 |