一个RAM例化形式如下
reg [7:0] addra_A;
reg [7:0] addrb_A;
A_RAM uut( //RAM 宽度:16 深度:480
.clka(clk),
.ena(ena_A),
.wea(1'b1),
.addra(addra_A),
.dina(dina_mv),
.douta(douta_A),
.clkb(clk),
.enb(enb_A),
.web(1'b0),
.addrb(addrb_A),
.dinb(dinb_mv),
.doutb(doutb_A)
);
其中RAM中的addra为9bit 即 addra[8:0] ;
而连接RAM地址的addra_A和addrb_A为8bit
这样RAM会出现问题。
如上面的例子 若8bit的addra_A=8'b1010_1010,例化后,addra=9'bZ_1010_1010。前面一位变成Z。就无法识别addra的数值了。
但是addra_A位数可以大于addra的,赋值时,产生截断。其实就相当于addra_A把值按位赋值给addra。
总结:
1、addra和addra_A位数应该相同。同理,不仅仅是RAM例化时,两者位数要相同,普通模块也要相同。
2、在verilog代码里(不是模块例化)
reg [2:0] a; reg [3:0] b;
b<=a;
在verilog模块的代码里可以这样写。