そもそもリターンメソッド(出力に相当する)が単一なのは、タイミング的に同時に12bitを読みだすからですが、これを4bitずつ3回にわけて読みだす形にします。すると、
interface ColorConverter;
(* prefix="" *)
method Action setInputs(
(* port="RI" *) Bit#(1) r,
(* port="GI" *) Bit#(1) g,
(* port="BI" *) Bit#(1) b);
(* result="RO" *)
method Bit#(4) getRO();
(* result="GO" *)
method Bit#(4) getGO();
(* result="BO" *)
method Bit#(4) getBO();
endinterface
(* synthesize, always_enabled = "setInputs" *)
module mkColorConverter(ColorConverter);
Wire#(Bit#(1)) r_reg <- mkWire;
Wire#(Bit#(1)) g_reg <- mkWire;
Wire#(Bit#(1)) b_reg <- mkWire;
method Action setInputs(Bit#(1) r, Bit#(1) g, Bit#(1) b);
r_reg <= r;
g_reg <= g;
b_reg <= b;
endmethod
method Bit#(4) getRO();
return (case ({r_reg, g_reg, b_reg})
3'b000: 4'h9;
3'b001: 4'hD;
3'b010: 4'h5;
3'b100: 4'hC;
default: ?;
endcase);
endmethod
method Bit#(4) getGO();
return (case ({r_reg, g_reg, b_reg})
3'b000: 4'h4;
3'b001: 4'h8;
3'b010: 4'hB;
3'b100: 4'hC;
default: ?;
endcase);
endmethod
method Bit#(4) getBO();
return (case ({r_reg, g_reg, b_reg})
3'b000: 4'h1;
3'b001: 4'h4;
3'b010: 4'h5;
3'b100: 4'hC;
default: ?;
endcase);
endmethod
endmodule
このソースからは以下のverilogが生成されます。
module mkColorConverter(CLK,
RST_N,
RI,
GI,
BI,
RO,
RDY_getRO,
GO,
RDY_getGO,
BO,
RDY_getBO);
input CLK;
input RST_N;
// action method setInputs
input RI;
input GI;
input BI;
// value method getRO
output [3 : 0] RO;
output RDY_getRO;
// value method getGO
output [3 : 0] GO;
output RDY_getGO;
// value method getBO
output [3 : 0] BO;
output RDY_getBO;
// signals for module outputs
reg [3 : 0] BO, GO, RO;
wire RDY_getBO, RDY_getGO, RDY_getRO;
// remaining internal signals
wire [2 : 0] x__h322;
// value method getRO
always@(x__h322)
begin
case (x__h322)
3'b0: RO = 4'h9;
3'b001: RO = 4'hD;
3'b010: RO = 4'h5;
default: RO = 4'hC;
endcase
end
assign RDY_getRO = 1'b1 ;
// value method getGO
always@(x__h322)
begin
case (x__h322)
3'b0: GO = 4'h4;
3'b001: GO = 4'h8;
3'b010: GO = 4'hB;
default: GO = 4'hC;
endcase
end
assign RDY_getGO = 1'b1 ;
// value method getBO
always@(x__h322)
begin
case (x__h322)
3'b0: BO = 4'h1;
3'b001: BO = 4'h4;
3'b010: BO = 4'h5;
default: BO = 4'hC;
endcase
end
assign RDY_getBO = 1'b1 ;
// remaining internal signals
assign x__h322 = { RI, GI, BI } ;
endmodule // mkColorConverter
出力ポートの形は狙い通り4bit×3個となりました。しかしながら、問題点は生成されたコメントにもあるように、
// Ports:
// Name I/O size props
// RO O 4
// RDY_getRO O 1 const
// GO O 4
// RDY_getGO O 1 const
// BO O 4
// RDY_getBO O 1 const
// CLK I 1 unused
// RST_N I 1 unused
// RI I 1
// GI I 1
- RDY信号が定数でalways_readyを示す
- CLK, RST_Nが未使用
であることから両者とも削除可能です。入力のenableは always_enabled = "setInputs" で示すように削除することができたのですが、always_readyを指定してもエラーとなり、RDY信号を削除することができませんでした。
さらに、no_default_clock, no_default_reset によりCLKとRST_Nを削除できる場合もあるようですが、この場合はエラーが発生してできませんでした。この2点が疑問です。
前のブログ
次のブログ