From 2311d3e2d6042fa57b4e05e61be9c126ebd4b400 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Fri, 11 Dec 2020 12:41:20 -0700 Subject: [PATCH] additional interface conversion test coverage --- src/Convert/Interface.hs | 27 ++++++++------------- test/basic/interface_array_indirect.sv | 23 ++++++++++++++++++ test/basic/interface_array_indirect.v | 8 ++++++ test/basic/interface_array_output.sv | 9 +++++++ test/basic/interface_array_output.v | 4 +++ test/basic/interface_array_single.sv | 7 ++++++ test/basic/interface_type_param.sv | 10 ++++++++ test/basic/interface_type_param.v | 5 ++++ test/basic/interface_unbound.sv | 15 ++++++++++++ test/basic/interface_unbound.v | 15 ++++++++++++ test/error/interface_excess_ports.sv | 8 ++++++ test/error/interface_missing_direction.sv | 9 +++++++ test/error/interface_modport_missing.sv | 15 ++++++++++++ test/error/interface_modport_unlisted.sv | 7 ++++++ test/error/interface_non_lhs.sv | 8 ++++++ test/error/interface_param_mismatch_expr.sv | 8 ++++++ test/error/interface_param_mismatch_type.sv | 8 ++++++ 17 files changed, 169 insertions(+), 17 deletions(-) create mode 100644 test/basic/interface_array_indirect.sv create mode 100644 test/basic/interface_array_indirect.v create mode 100644 test/basic/interface_array_output.sv create mode 100644 test/basic/interface_array_output.v create mode 100644 test/basic/interface_type_param.sv create mode 100644 test/basic/interface_type_param.v create mode 100644 test/basic/interface_unbound.sv create mode 100644 test/basic/interface_unbound.v create mode 100644 test/error/interface_excess_ports.sv create mode 100644 test/error/interface_missing_direction.sv create mode 100644 test/error/interface_modport_missing.sv create mode 100644 test/error/interface_modport_unlisted.sv create mode 100644 test/error/interface_non_lhs.sv create mode 100644 test/error/interface_param_mismatch_expr.sv create mode 100644 test/error/interface_param_mismatch_type.sv diff --git a/src/Convert/Interface.hs b/src/Convert/Interface.hs index 52afffa..cab813d 100644 --- a/src/Convert/Interface.hs +++ b/src/Convert/Interface.hs @@ -24,7 +24,7 @@ data PartInfo = PartInfo } deriving Eq type PartInfos = Map.Map Identifier PartInfo -type ModportInstances = [(Identifier, (Identifier, Identifier))] +type ModportInstances = [(Identifier, Identifier)] type ModportBinding = (Identifier, (Substitutions, Expr)) type Substitutions = [(Expr, Expr)] @@ -185,7 +185,7 @@ convertDescription parts (Part attrs extern Module lifetime name ports items) = bindingIsBundle = lookupElem modports (Dot expr "") /= Nothing portIsBundle = null modportName modportName = case lookup portName modportInstances of - Just (_, x) -> x + Just x -> x Nothing -> error $ "can't deduce modport for interface " ++ show expr ++ " bound to port " ++ portName @@ -259,15 +259,15 @@ convertDescription parts (Part attrs extern Module lifetime name ports items) = Just info = maybeInfo collectDecl _ = return () - extractModportInfo :: Type -> Maybe (Identifier, Identifier) - extractModportInfo (InterfaceT "" Nothing []) = Just ("", "") + extractModportInfo :: Type -> Maybe Identifier + extractModportInfo (InterfaceT "" Nothing []) = Just "" extractModportInfo (InterfaceT interfaceName (Just modportName) []) = if isInterface interfaceName - then Just (interfaceName, modportName) + then Just modportName else Nothing extractModportInfo (Alias interfaceName []) = if isInterface interfaceName - then Just (interfaceName, "") + then Just "" else Nothing extractModportInfo _ = Nothing @@ -285,9 +285,8 @@ impliedModport = execWriter . mapM (collectNestedModuleItemsM collectModportDecls) where collectModportDecls :: ModuleItem -> Writer [ModportDecl] () - collectModportDecls (MIPackageItem (Decl (Variable d _ x _ _))) = - tell [(d', x, Ident x)] - where d' = if d == Local then Inout else d + collectModportDecls (MIPackageItem (Decl (Variable _ _ x _ _))) = + tell [(Inout, x, Ident x)] collectModportDecls _ = return () -- convert an interface-bound module instantiation or an interface instantiation @@ -379,10 +378,6 @@ inlineInstance ranges modportBindings items case lookup (LHSDot (LHSBit lhs Tag) field) lhsReplacements of Just resolved -> replaceLHSArrTag elt resolved Nothing -> LHSDot (replaceLHS $ LHSBit lhs elt) field - replaceLHS (LHSBit lhs elt) = - case lookup (LHSBit lhs Tag) lhsReplacements of - Just resolved -> replaceLHSArrTag elt resolved - Nothing -> LHSBit (replaceLHS lhs) elt replaceLHS lhs = case lookup lhs lhsReplacements of Just lhs' -> lhs' @@ -402,12 +397,10 @@ inlineInstance ranges modportBindings items tagExpr :: Bool -> Scopes Expr -> Expr -> Expr tagExpr substitute scopes expr = case lookupElem scopes expr of - Just (_, _, Nil) -> Dot expr "@" - Just ([_, _], replacements, expr') -> - if substitute && Map.null replacements + Just (_, _, expr') -> + if substitute && expr' /= Nil then Dot expr' "@" else Dot expr "@" - Just (_, _, _) -> Dot expr "@" Nothing -> traverseSinglyNestedExprs (tagExpr substitute scopes) expr replaceExpr :: Expr -> Expr diff --git a/test/basic/interface_array_indirect.sv b/test/basic/interface_array_indirect.sv new file mode 100644 index 0000000..ec0ba0a --- /dev/null +++ b/test/basic/interface_array_indirect.sv @@ -0,0 +1,23 @@ +interface Interface; + integer x; +endinterface + +module Single(intf); + Interface intf; + initial #1 $display("Single %0d", intf.x); +endmodule + +module Group(intfs); + parameter WIDTH = 1; + Interface intfs [WIDTH]; + initial $display("Group %0d", WIDTH); + for (genvar i = 0; i < WIDTH; ++i) + Single s(intfs[i]); +endmodule + +module top; + Interface intfs[8](); + for (genvar i = 0; i < 8; ++i) + initial intfs[i].x = i ** 3; + Group #(.WIDTH(8)) g(intfs); +endmodule diff --git a/test/basic/interface_array_indirect.v b/test/basic/interface_array_indirect.v new file mode 100644 index 0000000..d8e0c48 --- /dev/null +++ b/test/basic/interface_array_indirect.v @@ -0,0 +1,8 @@ +module top; + initial $display("Group %0d", 8); + generate + genvar i; + for (i = 0; i < 8; i = i + 1) + initial #1 $display("Single %0d", i ** 3); + endgenerate +endmodule diff --git a/test/basic/interface_array_output.sv b/test/basic/interface_array_output.sv new file mode 100644 index 0000000..197fb81 --- /dev/null +++ b/test/basic/interface_array_output.sv @@ -0,0 +1,9 @@ +interface Interface(output out); + assign out = 1; +endinterface + +module top; + logic x; + Interface intfs[1](x); + initial $display(x); +endmodule diff --git a/test/basic/interface_array_output.v b/test/basic/interface_array_output.v new file mode 100644 index 0000000..765c32a --- /dev/null +++ b/test/basic/interface_array_output.v @@ -0,0 +1,4 @@ +module top; + wire x = 1; + initial $display(x); +endmodule diff --git a/test/basic/interface_array_single.sv b/test/basic/interface_array_single.sv index a47e303..ae21aab 100644 --- a/test/basic/interface_array_single.sv +++ b/test/basic/interface_array_single.sv @@ -33,6 +33,13 @@ module ModuleN(intf); Interface intf; `SHADOW initial #1 $display("ModuleN got %0d", intf.x); + + typedef struct packed { + logic a, b; + } Struct; + Struct [1:0] structs; + assign structs[1].a = structs[0].b; + assign structs[0].a = structs[1].b; endmodule module top; diff --git a/test/basic/interface_type_param.sv b/test/basic/interface_type_param.sv new file mode 100644 index 0000000..9025a25 --- /dev/null +++ b/test/basic/interface_type_param.sv @@ -0,0 +1,10 @@ +interface Interface; + parameter type T = logic [2:0]; + initial $display($bits(T)); +endinterface + +module top; + Interface #(logic) a(); + Interface #(byte) b(); + Interface c(); +endmodule diff --git a/test/basic/interface_type_param.v b/test/basic/interface_type_param.v new file mode 100644 index 0000000..0466faf --- /dev/null +++ b/test/basic/interface_type_param.v @@ -0,0 +1,5 @@ +module top; + initial $display(1); + initial $display(8); + initial $display(3); +endmodule diff --git a/test/basic/interface_unbound.sv b/test/basic/interface_unbound.sv new file mode 100644 index 0000000..eb37417 --- /dev/null +++ b/test/basic/interface_unbound.sv @@ -0,0 +1,15 @@ +interface Interface(input x); + initial $display("Hello!"); +endinterface + +module Module(i); + Interface i; + initial #1 $display(i.x); +endmodule + +module top; + Interface i1(); + Module m1(i1); + Interface i2(.x()); + Module m2(i2); +endmodule diff --git a/test/basic/interface_unbound.v b/test/basic/interface_unbound.v new file mode 100644 index 0000000..f0c62ef --- /dev/null +++ b/test/basic/interface_unbound.v @@ -0,0 +1,15 @@ +module Module(x); + input wire x; + initial $display("Hello!"); + initial #1 $display(x); +endmodule + +module top; + generate + if (1) begin + wire x; + Module m1(x); + Module m2(x); + end + endgenerate +endmodule diff --git a/test/error/interface_excess_ports.sv b/test/error/interface_excess_ports.sv new file mode 100644 index 0000000..b6d1cfc --- /dev/null +++ b/test/error/interface_excess_ports.sv @@ -0,0 +1,8 @@ +interface Interface(input a, output b); + assign b = a; +endinterface + +module top; + logic a, b, c; + Interface intf(a, b, c); +endmodule diff --git a/test/error/interface_missing_direction.sv b/test/error/interface_missing_direction.sv new file mode 100644 index 0000000..d56de31 --- /dev/null +++ b/test/error/interface_missing_direction.sv @@ -0,0 +1,9 @@ +interface Interface(a, b); + input a; + logic b; +endinterface + +module top; + logic a, b; + Interface intf(a, b); +endmodule diff --git a/test/error/interface_modport_missing.sv b/test/error/interface_modport_missing.sv new file mode 100644 index 0000000..c1ba561 --- /dev/null +++ b/test/error/interface_modport_missing.sv @@ -0,0 +1,15 @@ +interface Interface; + logic x; +endinterface + +module Module(i, j); + Interface i; + logic j; + assign i.x = j.x; +endmodule + +module top; + Interface i(); + Interface j(); + Module m(i, j); +endmodule diff --git a/test/error/interface_modport_unlisted.sv b/test/error/interface_modport_unlisted.sv new file mode 100644 index 0000000..9371607 --- /dev/null +++ b/test/error/interface_modport_unlisted.sv @@ -0,0 +1,7 @@ +interface Interface; + logic x; +endinterface + +module Module; + Interface i; +endmodule diff --git a/test/error/interface_non_lhs.sv b/test/error/interface_non_lhs.sv new file mode 100644 index 0000000..a36eca0 --- /dev/null +++ b/test/error/interface_non_lhs.sv @@ -0,0 +1,8 @@ +interface Interface(input a, output b); + assign b = a; +endinterface + +module top; + logic a, b; + Interface intf(a, b + 1); +endmodule diff --git a/test/error/interface_param_mismatch_expr.sv b/test/error/interface_param_mismatch_expr.sv new file mode 100644 index 0000000..be11ab9 --- /dev/null +++ b/test/error/interface_param_mismatch_expr.sv @@ -0,0 +1,8 @@ +interface Interface; + parameter T = 0; + logic [T-1:0] x; +endinterface + +module top; + Interface #(logic) intf(); +endmodule diff --git a/test/error/interface_param_mismatch_type.sv b/test/error/interface_param_mismatch_type.sv new file mode 100644 index 0000000..7954d0a --- /dev/null +++ b/test/error/interface_param_mismatch_type.sv @@ -0,0 +1,8 @@ +interface Interface; + parameter type T; + T x; +endinterface + +module top; + Interface #(1) intf(); +endmodule