目的:
多ビット信号の配列(二次元配列)を使用する。宣言:
レジスタ(メモリ)reg [7:0] r_data[0:127] // 8bit幅 128 個のレジスタ宣言
信号(Wire)
wire [7:0] w_data[0:127] // 8bit幅 128 組の ワイヤ宣言
Verilog では ポートに二次元配列は使用できない。
代入:
wire sig_1b ;wire [7:0] sig_8b ;
assign w_data[14] = sig ; // 8bit 幅の信号を 15番目の 8bit信号 に代入
assign sig_1b = w_data[127][7] ; // 1bit 幅の信号に 127番目の bit7(MSB)を代入
例:
回路図verilog (モジュール)
FF は generate 文を使用して for - next で 記述。
ポートは二次元配列で記述できない為、内部で宣言した wire に 1つづつ assign 。
二次元配列から一次元配列へのアサインは「多ビット信号の配列(二次元配列)と入出力ポート 」を参照。
// ----------------------------------------------------- // Sample module // // Module Name : test_md1 // Version : 0.00 // ----------------------------------------------------- module test_md1 #( // Module name : test parameter BIT_WIDTH = 4 , // parameter list parameter DATA_NUM = 8 // parameter list ) ( // clr, // port list clk, enable, set, data_1, data_2, data_3, data_4, data_5, data_6, data_7, data_8, out_dt1, out_dt2, out_dt3, out_dt4, out_dt5, out_dt6, out_dt7, out_dt8, dt_msb ) ; // port declaration ---------------- input clr ; input clk ; input enable ; input set ; input [BIT_WIDTH-1:0] data_1 ; input [BIT_WIDTH-1:0] data_2 ; input [BIT_WIDTH-1:0] data_3 ; input [BIT_WIDTH-1:0] data_4 ; input [BIT_WIDTH-1:0] data_5 ; input [BIT_WIDTH-1:0] data_6 ; input [BIT_WIDTH-1:0] data_7 ; input [BIT_WIDTH-1:0] data_8 ; output [BIT_WIDTH-1:0] out_dt1 ; output [BIT_WIDTH-1:0] out_dt2 ; output [BIT_WIDTH-1:0] out_dt3 ; output [BIT_WIDTH-1:0] out_dt4 ; output [BIT_WIDTH-1:0] out_dt5 ; output [BIT_WIDTH-1:0] out_dt6 ; output [BIT_WIDTH-1:0] out_dt7 ; output [BIT_WIDTH-1:0] out_dt8 ; output [DATA_NUM-1:0] dt_msb ; // parameter declaration ----------- parameter DLY = 1 ; // internal signal declaration ----- wire set_enable ; wire [BIT_WIDTH-1:0] in_data[1:DATA_NUM] ; reg [BIT_WIDTH-1:0] lt_data[1:DATA_NUM] ; // logical description ------------- assign set_enable = enable & set ; assign in_data[1] = data_1 ; assign in_data[2] = data_2 ; assign in_data[3] = data_3 ; assign in_data[4] = data_4 ; assign in_data[5] = data_5 ; assign in_data[6] = data_6 ; assign in_data[7] = data_7 ; assign in_data[8] = data_8 ; generate genvar i ; for (i=1; i<DATA_NUM+1; i=i+1) begin : dtlatch always @(posedge clk or posedge clr) if (clr) lt_data[i] <= #DLY {BIT_WIDTH{1'b0}} ; else if (set_enable) lt_data[i] <= #DLY in_data[i] ; assign dt_msb[i-1] = lt_data[i][BIT_WIDTH-1] ; end endgenerate assign out_dt1 = lt_data[1] ; assign out_dt2 = lt_data[2] ; assign out_dt3 = lt_data[3] ; assign out_dt4 = lt_data[4] ; assign out_dt5 = lt_data[5] ; assign out_dt6 = lt_data[6] ; assign out_dt7 = lt_data[7] ; assign out_dt8 = lt_data[8] ; endmodule
verilog (上位階層)
// Sample test // // Module Name : test // Version : 0.00 // ----------------------------------------------------- module test( clr, // port list clk, enable, set, data_1, data_2, data_3, data_4, data_5, data_6, data_7, data_8, out_dt1, out_dt2, out_dt3, out_dt4, out_dt5, out_dt6, out_dt7, out_dt8, dt_msb ) ; // port declaration ---------------- input clr ; input clk ; input enable ; input set ; input [7:0] data_1 ; input [7:0] data_2 ; input [7:0] data_3 ; input [7:0] data_4 ; input [7:0] data_5 ; input [7:0] data_6 ; input [7:0] data_7 ; input [7:0] data_8 ; output [7:0] out_dt1 ; output [7:0] out_dt2 ; output [7:0] out_dt3 ; output [7:0] out_dt4 ; output [7:0] out_dt5 ; output [7:0] out_dt6 ; output [7:0] out_dt7 ; output [7:0] out_dt8 ; output [7:0] dt_msb ; test_md1 #( .BIT_WIDTH (8) )i_test( .clr (clr), .clk (clk), .enable (enable), .set (set), .data_1 (data_1), .data_2 (data_2), .data_3 (data_3), .data_4 (data_4), .data_5 (data_5), .data_6 (data_6), .data_7 (data_7), .data_8 (data_8), .out_dt1 (out_dt1), .out_dt2 (out_dt2), .out_dt3 (out_dt3), .out_dt4 (out_dt4), .out_dt5 (out_dt5), .out_dt6 (out_dt6), .out_dt7 (out_dt7), .out_dt8 (out_dt8), .dt_msb (dt_msb) ) ; endmodule
verilog (テストベンチ, 呼び出し側)
// ---------------------------------------------------------- // test bench // // for test.v // ---------------------------------------------------------- `timescale 1ns / 1ps module testbench ; // testbench logic ------------------- reg clr; reg clk; reg [7:0] in_data_1 ; reg [7:0] in_data_2 ; reg [7:0] in_data_3 ; reg [7:0] in_data_4 ; reg [7:0] in_data_5 ; reg [7:0] in_data_6 ; reg [7:0] in_data_7 ; reg [7:0] in_data_8 ; reg enable ; reg set ; wire [7:0] out_data_1 ; wire [7:0] out_data_2 ; wire [7:0] out_data_3 ; wire [7:0] out_data_4 ; wire [7:0] out_data_5 ; wire [7:0] out_data_6 ; wire [7:0] out_data_7 ; wire [7:0] out_data_8 ; wire [7:0] data_msb ; test i_test( .clr (clr), .clk (clk), .enable (enable), .set (set), .data_1 (in_data_1), .data_2 (in_data_2), .data_3 (in_data_3), .data_4 (in_data_4), .data_5 (in_data_5), .data_6 (in_data_6), .data_7 (in_data_7), .data_8 (in_data_8), .out_dt1 (out_data_1), .out_dt2 (out_data_2), .out_dt3 (out_data_3), .out_dt4 (out_data_4), .out_dt5 (out_data_5), .out_dt6 (out_data_6), .out_dt7 (out_data_7), .out_dt8 (out_data_8), .dt_msb (data_msb) ) ; initial begin clk = 0 ; clr = 1 ; #10 clr = 0 ; forever begin #10 clk = ~clk ; end end // scenario -------------------------- initial begin $dumpfile("tb.vcd"); $dumpvars(0,testbench) ; enable = 1'b0 ; set = 1'b0 ; in_data_1 = 8'd0 ; in_data_2 = 8'd0 ; in_data_3 = 8'd0 ; in_data_4 = 8'd0 ; in_data_5 = 8'd0 ; in_data_6 = 8'd0 ; in_data_7 = 8'd0 ; in_data_8 = 8'd0 ; #200 enable = 1'b1 ; in_data_1 = 8'h01 ; in_data_2 = 8'h92 ; in_data_3 = 8'h23 ; in_data_4 = 8'hb4 ; in_data_5 = 8'hc5 ; in_data_6 = 8'h56 ; in_data_7 = 8'he7 ; in_data_8 = 8'h78 ; #101 set = 1'b1 ; #20 set = 1'b0 ; #100 enable = 1'b0 ; in_data_1 = 8'hff ; in_data_2 = 8'hff ; in_data_3 = 8'hff ; in_data_4 = 8'hff ; in_data_5 = 8'hff ; in_data_6 = 8'hff ; in_data_7 = 8'hff ; in_data_8 = 8'hff ; #101 set = 1'b1 ; #20 set = 1'b0 ; #200 ; $finish; end endmodule
シミュレーション結果
0 件のコメント:
コメントを投稿