機能
8word x 8bit PROM モジュール
信号機能
AD_i[3] = アドレス入力
CS_i = チップセレクト入力
REN_i = 読み出しイネーブル入力
DB_o[8] = データ出力
記述特徴
メモリを推論させるためにはmemを使います。
mem メモリ名 [n][m] = { 初期値,初期値, … } ;
上記の例だと、nワードでmビットのメモリ名という名前のメモリが作られます。
{}で初期値を与えることができます。初期値がメモリの数より少ない場合、足りない分は0で初期化されます。
NSL記述例
/* ************************************************************ */
declare RAM_PROM {
input AD_i[3] ; // Address (in)
output DB_o1[8] ; // Read Data (out) / Asynchronous
output DB_o2[8] ; // Read Data (out) / Clock synchronous
input CS_i ; // Chip select (in)
input REN_i ; // Read enable (in)
}
/* ************************************************************ */
// Declare module
module RAM_PROM {
/* ************************************************************ */
// Internal operation signals
mem mem_array [8][8] = { 0x01, 0x02, 0x03, 0x04, // C like statement
8'b10010110, // Binary data
8'o70, // Octal data
8'd254, // Decimal data
8'hAC // Hex decimal data
} ;
// In this case, initial values are setted as follows :
// mem_array[0] = 1
// mem_array[1] = 2
// mem_array[2] = 3
// mem_array[3] = 4
// mem_array[4] = 0x96
// mem_array[5] = 0x38
// mem_array[6] = 0xFE
// mem_array[7] = 0xAC
reg clocked_rdout[8] ;
/* ************************************************************ */
// Equation
{
// Asynchronized output
if ( CS_i & REN_i ) {
DB_o1 = mem_array[AD_i] ;
} else {
DB_o1 = 8'h00 ;
}
// Clock synchronized output
if ( CS_i & REN_i ) {
clocked_rdout := mem_array[AD_i] ;
} else {
clocked_rdout := 8'h00 ;
}
DB_o2 = clocked_rdout ;
}
/* ************************************************************ */
}
Verilog変換例
/*
Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:54:57 2010
Licensed to :EVALUATION USER:
*/
module RAM_PROM ( p_reset , m_clock , AD_i , DB_o1 , DB_o2 , CS_i , REN_i );
input p_reset, m_clock;
input [2:0] AD_i;
output [7:0] DB_o1;
output [7:0] DB_o2;
input CS_i;
input REN_i;
reg [7:0] mem_array [0:7];
reg [7:0] clocked_rdout;
wire _net_0;
wire _net_1;
assign _net_0 = CS_i&REN_i;
assign _net_1 = CS_i&REN_i;
//synthesis translate_off
always @(posedge m_clock or posedge p_reset)
begin
if ((~_net_0)&_net_0)
begin $display("Warning: assign collision(RAM_PROM:DB_o1) at %d",$time);
if (~_net_0) $display("assert (~_net_0) at 44\n");
if (_net_0) $display("assert (_net_0) at 42\n");
end
end
//synthesis translate_on
assign DB_o1 =
//synthesis translate_off
((~_net_0)&_net_0)? 8'bx :((~_net_0)|_net_0)?
//synthesis translate_on
((~_net_0)?8'b00000000:8'b0)|
((_net_0)?mem_array[AD_i]:8'b0)
//synthesis translate_off
:8'bx
//synthesis translate_on
;
assign DB_o2 = clocked_rdout;
initial begin
mem_array[0] <= 8'b00000001;
mem_array[1] <= 8'b00000010;
mem_array[2] <= 8'b00000011;
mem_array[3] <= 8'b00000100;
mem_array[4] <= 8'b10010110;
mem_array[5] <= 8'b00111000;
mem_array[6] <= 8'b11111110;
mem_array[7] <= 8'b10101100;
end
always @(posedge m_clock)
begin
//synthesis translate_off
if ((~_net_1)&_net_1) clocked_rdout <= 8'bx;
else
//synthesis translate_on
if (~_net_1)
clocked_rdout <= 8'b00000000;
else if (_net_1)
clocked_rdout <= mem_array[AD_i];
end
//synthesis translate_off
always @(posedge m_clock)
begin
if (((~_net_1)|_net_1=='b1) ||
((~_net_1)|_net_1=='b0) ) begin
if ((~_net_1)&_net_1)
begin $display("Warning: assign collision(RAM_PROM:clocked_rdout) at %d",$time);
end
end
else
$display("Warning: register set hazard(RAM_PROM:clocked_rdout) at %d",$time);
end
//synthesis translate_on
endmodule
/*
Produced by NSL Core, IP ARCH, Inc. Fri Jun 04 17:54:57 2010
Licensed to
*/