class DP16KD(Module): def __init__(self, width_a, width_b): addr_width_a = int(math.log2(18 * 1024 // width_a)) addr_width_b = int(math.log2(18 * 1024 // width_b)) self.ada = Signal(addr_width_a) self.dia = Signal(width_a) self.doa = Signal(width_a) self.csa = Signal(width_a // 8 or 1) self.wea = Signal() self.adb = Signal(addr_width_b) self.dib = Signal(width_b) self.dob = Signal(width_b) self.csb = Signal(width_b // 8 or 1) self.web = Signal() ram = Instance('DP16KD', p_DATA_WIDTH_A = width_a, p_DATA_WIDTH_B = width_b, p_WRITEMODE_A = 'READBEFOREWRITE', p_WRITEMODE_B = 'READBEFOREWRITE', **{'i_ADA%d' % i: self.ada[i] for i in range(addr_width_a)}, **{'i_DIA%d' % i: self.dia[i] for i in range(width_a)}, **{'o_DOA%d' % i: self.doa[i] for i in range(width_a)}, **{'o_CSA%d' % i: self.csa[i] for i in range(width_a // 8 or 1)}, i_WEA = self.wea, i_CLKA = ClockSignal('clka'), **{'i_ADB%d' % i: self.adb[i] for i in range(addr_width_b)}, **{'i_DIB%d' % i: self.dib[i] for i in range(width_b)}, **{'o_DOB%d' % i: self.dob[i] for i in range(width_b)}, **{'o_CSB%d' % i: self.csb[i] for i in range(width_b // 8 or 1)}, i_WEB = self.web, i_CLKB = ClockSignal('clkb'), ) self.specials += ram