一个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模块的代码里可以这样写。