Requirements and Requirement Relationships follow a few basic guidelines:
Requirements are foundational to any system design and represent a Pillar of SysML.
A good requirement is a complete sentence with a single ‘SHALL’.
Characteristics of a Requirement Statement are: Clear and Consistent, Correct, Feasible, Flexible, Un-ambiguous, Singular, and Verifiable.
Requirements also don‘t come in a one size fits all package. They can and should be broken up into logical categories to allow users to understand how they should be related into one‘s architecture. We break requirements into 4 different types but we understand the community breaks them up in all sorts of ways. Here is our cut at requirements types with their definitions:
This is by far the most common requirement type and is a cornerstone to any system design. A functional requirement defines what functions a given system (or other fidelity level: subsystem, CI) shall perform to accomplish a given mission or operational objectives.
Defines how a given system interacts or exchanges with another system. These requirements can be categorized by both logical and physical interactions.
Non-Functional requirements have a large grouping of categories beneath them and are sometimes referred to as the ‘illities’ (reliability, safety, human factors). They serve a purpose to define a specific criteria used to judge the operation of a system, rather than a specific function. They are in direct contrast with functional requirements which define system behaviors. For the sake of time in our demonstration, we will be showing you how to relate a physical and an environmental non-functional requirement.
Defines how well a given system needs to perform to support a functionality.
Requirements and Requirement Relationships
A containment relationship is mainly used for organizational purposes within your requirements hierarchy. In general terms, it should be used when you want to convey a requirement containing sub-requirements. This is key when organization is important and a given number scheme has been given to requirements and sub requirements. The Requirements will generally follow a decimla numbering pattern like (1, 1.1, 1.1.1). This relation should not be mistaken for parent/child relationships, as a derive relationship should be used for that.
A derive relationship is used when you would like to convey the next level of system hierarchy for a requirement. For example, when a system requirement is decomposed to subsystem requirements, they should be related via a derive relationship. This relation is used quite frequently when defining the parent child relationship between two requirements. While containment can be used for this purpose, we recommend using derive for all parent child relationships due to its ability to enable reuse of children (modularity). It should be noted that a derive relationship should be used ONLY between requirements. No other model element is applicable for this relationship type.
The verify relationship defines how a requirement is proven or verified. This is generally shown through the use of test cases within your model architecture.
A trace relationship is a WEAK relationship and does not have directionality. We have mainly used it for tracing to an artifact library but it can be used for anything that doesn‘t necessarily fit into the categories above. It can serve as a PLACEHOLDER until you find a better way to relate your requirement. Please use the above relationships before considering this relationship.