From 043b464b1f9ba657d714d0e0357919971df20ef7 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 28 Nov 2022 09:18:59 +0100 Subject: [PATCH 001/183] [VPTOOP][WIP] Create a demonstrator of Design Document handling. * tools/vptool/vptool/vp_pack.py (Item.__init__): Set defaults for Design Doc references: ref mode 'page', viewer 'firefox'. * tools/vptool/vptool/vp.py (MyTextWidget.__init__): Add a grid-based area for design doc information. Include selectors for reference mode (page or section) and for document viewer (firefix or evince). Reduce size of design doc location. Fix typos. (MyTextWidget.vew_file): New. (MyTextWidget.refmode_btn_selected): Ditto. (MyTextWidget.docviewer_btn_selected): Ditto. (MyTextWidget.pack): Do not pack Requirement Location text at the MyText level. (MyTextWidget.update_ref_mode): New. (MyMain.update_desc_widget): Update ref mode state and child widget based on item state. (MyMain.update_ref_mode): New. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 88 ++++++++++++++++++++++++++++++++-- tools/vptool/vptool/vp_pack.py | 4 ++ 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index af214b54d..f6dcf8406 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -557,6 +557,42 @@ class MyTextWidget(ttk.LabelFrame): text=vp_config.yaml_config["gui"]["requirement_loc"]["label"], style="enabled.TLabelframe", ) + # Design doc information uses a grid layout. + # - first row is a URL of the document + # - second row contains selectors for page/section mode and value, and a 'View' button. + self.text1frame.grid(column=0, row=0, padx=20, pady=20) + url_label = ttk.Label(self.text1frame, text="Path or URL", anchor=tk.E) + url_label.grid(column=0, row=0, sticky=tk.E, padx=10, pady=10) + mode_label = ttk.Label(self.text1frame, text="Refer to...", anchor=tk.E) + mode_label.grid(column=0, row=1, sticky=tk.E, padx=10) + self.page_num_var = tk.StringVar(self) + page_entry = ttk.Entry(self.text1frame, textvariable=self.page_num_var, width=4) + page_entry.grid(column=2, row=1, sticky=tk.W) + self.section_num_var= tk.StringVar(self) + section_entry = ttk.Entry(self.text1frame, textvariable=self.section_num_var, width=4) + section_entry.grid(column=2, row=2, sticky=tk.W) + view_btn = ttk.Button(self.text1frame, text="Show design doc", command=self.view_file) + view_btn.grid(column=5, row=2, sticky=tk.E) + self.ref_mode_var = tk.StringVar(self) + ref_mode_names = ("(consecutive) page #", "section #") + ref_mode_values = ("page", "section") + row = 1 + for (name, value) in zip(ref_mode_names, ref_mode_values): + btn = ttk.Radiobutton(self.text1frame, text=name, value=value, variable=self.ref_mode_var, command=self.refmode_btn_selected) + btn.grid(column=1, row=row, sticky=tk.W) + row +=1 + # Label of the viewer selector buttons + viewer_label = ttk.Label(self.text1frame, text="Design doc viewer", anchor=tk.E) + viewer_label.grid(column=3, row=1, sticky=tk.E) + self.viewer_var = tk.StringVar(self) + viewer_names = ("Mozilla Firefox", "Evince PDF viewer") + viewer_values = ("firefox", "evince") + row = 1 + for (name, value) in zip(viewer_names, viewer_values): + btn = ttk.Radiobutton(self.text1frame, text=name, value=value, variable=self.viewer_var, command=self.docviewer_btn_selected) + btn.grid(column=4, row=row, sticky=tk.W) + row += 1 + self.text3frame = ttk.LabelFrame( self, text=vp_config.yaml_config["gui"]["verif_goals"]["label"], @@ -578,7 +614,7 @@ class MyTextWidget(ttk.LabelFrame): style="enabled.TLabelframe", ) # Selectors of verif point properties (PFC, TT, CM) and applicable cores use a layout - # different from the surrounding widgets, so we pack the in a canvas of their own. + # different from the surrounding widgets, so we pack them in a canvas of their own. self.selector_canvas = tk.Canvas(self) self.settings_frame = ttk.LabelFrame( self.selector_canvas, @@ -646,11 +682,12 @@ class MyTextWidget(ttk.LabelFrame): self.text1frame, cue_text=vp_config.yaml_config["gui"]["requirement_loc"]["cue_text"], state="disabled", - height=4, + height=1, bg=BG_COLOR, undo=True, wrap="word", ) + self.text1.grid(column=1, row=0, sticky=tk.W, columnspan=5) self.text3 = MyText( self.text3frame, cue_text=vp_config.yaml_config["gui"]["verif_goals"]["cue_text"], @@ -797,6 +834,41 @@ class MyTextWidget(ttk.LabelFrame): self.bcancel.pack(side="left") self.pack(side, padx, pady) + def view_file(self): + """ + View the requirement file (Design Doc) at the position specified in Requirement Location frame. + """ + print(f"### Calling MyTextWidget.view_file('{self.text1.get(0.0, tk.END).rstrip()}', '#page={self.page_num_var.get()}|#nameddest=section.{self.section_num_var.get()}'" + ) + if self.ref_mode_var.get() == "page": + ref_in_doc = f"#page={self.page_num_var.get().rstrip()}" + elif self.ref_mode_var.get() == "section": + ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" + else: + ref_in_doc = "" + command = "firefox " + \ + self.text1.get(0.0, tk.END).rstrip() + ref_in_doc + print(f"### ==> command = {command}") + os.system(command) + + def refmode_btn_selected(self): + """ + Callback to handle the selection of the Design Doc reference mode. + Sets the value of the corresponding item attribute. + """ + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().ref_mode = self.ref_mode_var.get() + + def docviewer_btn_selected(self): + """ + Callback to handle the selection of the design doc viewer. + Sets the value of the corresponding item attribute. + """ + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().viewer = self.viewer_var.get() + def all_cores_btn_selected(self): print("### self.cores_all.get() = %d" % self.cores_all.get()) if self.cores_all.get() == 1: @@ -910,7 +982,7 @@ class MyTextWidget(ttk.LabelFrame): def pack(self, side, padx, pady): self.text.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) - self.text1.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) + #self.text1.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) self.text3.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) self.text4.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) self.text5.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) @@ -984,6 +1056,10 @@ class MyTextWidget(ttk.LabelFrame): def button_pack_forget(self): self.bframe.pack_forget() + def update_ref_mode(self, mode): + self.ref_mode = mode + self.ref_mode_var.set(mode) + def update_item_tag(self, in_text): self.text6.configure(state="normal") self.text6.delete("1.0", tk.END) @@ -1609,6 +1685,8 @@ class MyMain: self.desc_widget.text5, current_item.coverage_loc ) self.desc_widget.update_item_tag(current_item.tag) + ref_mode = current_item.ref_mode if hasattr(current_item, "ref_mode") else "page" + self.desc_widget.update_ref_mode(ref_mode) pfc = current_item.pfc self.desc_widget.update_pfc(pfc) test_type = current_item.test_type @@ -1652,6 +1730,10 @@ class MyMain: self.update_desc_widget() # reprint current item initial value self.unfreeze_all() + def update_ref_mode(self): + self.get_current_item().ref_mode = self.desc_widget.ref_mode_var.get() + self.desc_widget.update_ref_mode(self.desc_widget.ref_mode_var.get()) + def update_pfc(self): self.get_current_item().pfc = self.desc_widget.pfc.get() self.desc_widget.update_pfc(self.desc_widget.pfc.get()) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index 052d0c6f3..3360f7f27 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -74,6 +74,10 @@ class Item: self.verif_goals = "" # Location of coverage data self.coverage_loc = "" + # Use page as the default reference mode for design docs. + # This will work with all files (no reliance on named dests). + self.ref_mode = "page" + self.viewer = "firefox" # FIXME: Propagate default value from YAML config. self.pfc = -1 # none selected, must choose self.test_type = -1 # none selected, must choose From f9b7be394339f00ec60a39a16c3a472913ffaaec Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 28 Nov 2022 20:50:53 +0100 Subject: [PATCH 002/183] [VPTOOL] Add fully functional requirement visualization widget. * tools/vptool/vptool/vp.py (MyTextWidget.__init__): Add callback trigger to page and section number fields. (MyTextWidget.ref_page_num_changed): New callback. (MyTextWidget.ref_section_num_changed): Ditto. (MyTextWidget.view_file): Do not print input args on console. Construct command line args according to viewing mode (HTML/PDF). Run command in background to allow editing while viewing the requirement doc. (MyTextWidget.viewer_btn_selected): Rename viewer attribute in Item to 'ref_viewer'. (MyTextWidget.update_page_num): New. (MyTextWidget.update_section_num): Ditto. (MyTextWidget.update_viewer): Ditto. (MyMain.update_desc_widget): Use try/except to detect missing fields in database. (MyMain.update_page_num): New. (MyMain.update_section_num): Ditto. (MyMain.update_viewer): Ditto. * tools/vptool/vptool/vp_pack.py (Item.__init__): Update comments. Rename 'viewer' to 'ref_viewer'. Add defaults for page and section attributes. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 104 ++++++++++++++++++++++++++++----- tools/vptool/vptool/vp_pack.py | 7 ++- 2 files changed, 96 insertions(+), 15 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index f6dcf8406..f171ef3a4 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -568,9 +568,15 @@ class MyTextWidget(ttk.LabelFrame): self.page_num_var = tk.StringVar(self) page_entry = ttk.Entry(self.text1frame, textvariable=self.page_num_var, width=4) page_entry.grid(column=2, row=1, sticky=tk.W) + # Use a callaback to update state upon changes to page number field. + self.page_num_var.trace("w", self.ref_page_num_changed) + self.section_num_var= tk.StringVar(self) section_entry = ttk.Entry(self.text1frame, textvariable=self.section_num_var, width=4) section_entry.grid(column=2, row=2, sticky=tk.W) + # Use a callaback to update state upon changes to section number field. + self.section_num_var.trace("w", self.ref_section_num_changed) + view_btn = ttk.Button(self.text1frame, text="Show design doc", command=self.view_file) view_btn.grid(column=5, row=2, sticky=tk.E) self.ref_mode_var = tk.StringVar(self) @@ -834,22 +840,43 @@ class MyTextWidget(ttk.LabelFrame): self.bcancel.pack(side="left") self.pack(side, padx, pady) + def ref_page_num_changed(self, *args): + """React to change in page number stringvar.""" + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().ref_page = self.page_num_var.get() + + def ref_section_num_changed(self, *args): + """React to change in section number stringvar.""" + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().ref_section = self.section_num_var.get() + def view_file(self): """ View the requirement file (Design Doc) at the position specified in Requirement Location frame. """ - print(f"### Calling MyTextWidget.view_file('{self.text1.get(0.0, tk.END).rstrip()}', '#page={self.page_num_var.get()}|#nameddest=section.{self.section_num_var.get()}'" - ) - if self.ref_mode_var.get() == "page": - ref_in_doc = f"#page={self.page_num_var.get().rstrip()}" - elif self.ref_mode_var.get() == "section": - ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" - else: - ref_in_doc = "" - command = "firefox " + \ - self.text1.get(0.0, tk.END).rstrip() + ref_in_doc + if self.viewer_var.get() == "firefox": + # Browser mode: use HREFs with suffix #=. + if self.ref_mode_var.get() == "page": + ref_in_doc = f"#page={self.page_num_var.get().rstrip()}" + elif self.ref_mode_var.get() == "section": + ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" + else: + ref_in_doc = "" + command = [ "firefox", + "file://" + self.text1.get(0.0, tk.END).rstrip() + ref_in_doc ] + elif self.viewer_var.get() == "evince": + # PDF viewer mode: use appropriate cmdline option. + if self.ref_mode_var.get() == "page": + ref_in_doc = ["-i", f"{self.page_num_var.get().rstrip()}" ] + elif self.ref_mode_var.get() == "section": + ref_in_doc = ["-n", f"section.{self.section_num_var.get().rstrip()}"] + else: + ref_in_doc = [] + command = ["evince"] + ref_in_doc + [self.text1.get(0.0, tk.END).rstrip()] print(f"### ==> command = {command}") - os.system(command) + subprocess.Popen(command) def refmode_btn_selected(self): """ @@ -867,7 +894,7 @@ class MyTextWidget(ttk.LabelFrame): """ current_item = self.parent.item_widget.get_selection() if current_item and not self.parent.get_current_item().is_locked(): - self.parent.get_current_item().viewer = self.viewer_var.get() + self.parent.get_current_item().ref_viewer = self.viewer_var.get() def all_cores_btn_selected(self): print("### self.cores_all.get() = %d" % self.cores_all.get()) @@ -1060,6 +1087,18 @@ class MyTextWidget(ttk.LabelFrame): self.ref_mode = mode self.ref_mode_var.set(mode) + def update_page_num(self, page): + self.page_num = page + self.page_num_var.set(page) + + def update_section_num(self, section): + self.section_num = section + self.section_num_var.set(section) + + def update_viewer(self, viewer): + self.viewer = viewer + self.viewer_var.set(viewer) + def update_item_tag(self, in_text): self.text6.configure(state="normal") self.text6.delete("1.0", tk.END) @@ -1685,8 +1724,35 @@ class MyMain: self.desc_widget.text5, current_item.coverage_loc ) self.desc_widget.update_item_tag(current_item.tag) - ref_mode = current_item.ref_mode if hasattr(current_item, "ref_mode") else "page" + # Update mode of reference to location inside design doc. + # DB migration: Assume 'page' as default if the field was not present. + try: + ref_mode = current_item.ref_mode + except AttributeError: + ref_mode = "page" self.desc_widget.update_ref_mode(ref_mode) + # Update page number inside design doc. + # DB migration: Assume empty string as default if the field was not present. + try: + ref_page = current_item.ref_page + except AttributeError: + ref_page = "" + self.desc_widget.update_page_num(ref_page) + # Update section number inside design doc. + # DB migration: Assume empty string as default if the field was not present. + try: + ref_section = current_item.ref_section + except AttributeError: + ref_section = "" + self.desc_widget.update_section_num(ref_section) + # Update name of viewer app that should be used to display the design doc. + # DB migration: Assume empty string as default if the field was not present. + try: + ref_viewer = current_item.ref_viewer + except AttributeError: + ref_viewer = "firefox" + self.desc_widget.update_viewer(ref_viewer) + pfc = current_item.pfc self.desc_widget.update_pfc(pfc) test_type = current_item.test_type @@ -1734,6 +1800,18 @@ class MyMain: self.get_current_item().ref_mode = self.desc_widget.ref_mode_var.get() self.desc_widget.update_ref_mode(self.desc_widget.ref_mode_var.get()) + def update_page_num(self): + self.get_current_item().ref_page = self.desc_widget.page_num_var.get() + self.desc_widget.update_page_num(self.desc_widget.page_num_var.get()) + + def update_section_num(self): + self.get_current_item().ref_section = self.desc_widget.section_num_var.get() + self.desc_widget.update_section_num(self.desc_widget.section_num_var.get()) + + def update_viewer(self): + self.get_current_item().ref_viewer = self.desc_widget.viewer_var.get() + self.desc_widget.update_viewer(self.desc_widget.viewer_var.get()) + def update_pfc(self): self.get_current_item().pfc = self.desc_widget.pfc.get() self.desc_widget.update_pfc(self.desc_widget.pfc.get()) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index 3360f7f27..2f6f9e7bc 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -68,7 +68,8 @@ class Item: self.tag = tag # Description of feature to be tested self.description = description - # Requirement to be verified + # Requirement to be verified (from now on, the design document...) + # FIXME: field naming needs a major rework. self.purpose = purpose # Summary of verification goals self.verif_goals = "" @@ -77,7 +78,9 @@ class Item: # Use page as the default reference mode for design docs. # This will work with all files (no reliance on named dests). self.ref_mode = "page" - self.viewer = "firefox" + self.ref_page = "" + self.ref_section = "" + self.ref_viewer = "firefox" # FIXME: Propagate default value from YAML config. self.pfc = -1 # none selected, must choose self.test_type = -1 # none selected, must choose From 63916fceea5afadcd6cac0827eb2182c5e9383b0 Mon Sep 17 00:00:00 2001 From: Jean-Roch Coulon Date: Wed, 7 Dec 2022 10:51:24 +0100 Subject: [PATCH 003/183] fix dm_pkg path Signed-off-by: Jean-Roch Coulon --- cva6/tb/core/Flist.cva6_tb | 1 + 1 file changed, 1 insertion(+) diff --git a/cva6/tb/core/Flist.cva6_tb b/cva6/tb/core/Flist.cva6_tb index 9fb590029..d366d8017 100644 --- a/cva6/tb/core/Flist.cva6_tb +++ b/cva6/tb/core/Flist.cva6_tb @@ -26,6 +26,7 @@ /////////////////////////////////////////////////////////////////////////////// // These need to be moved +${CVA6_REPO_DIR}/corev_apu/riscv-dbg/src/dm_pkg.sv ${CVA6_REPO_DIR}/corev_apu/axi_mem_if/src/axi2mem.sv ${CVA6_REPO_DIR}/corev_apu/tb/ariane_soc_pkg.sv From b85d6adbd59ff74c97540f4ae18a2443351125b1 Mon Sep 17 00:00:00 2001 From: Jean-Roch Coulon Date: Mon, 12 Dec 2022 09:29:08 +0100 Subject: [PATCH 004/183] Use only one Flist for all configurations Signed-off-by: Jean-Roch Coulon --- cva6/sim/Makefile | 5 ++++- cva6/sim/cva6.yaml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cva6/sim/Makefile b/cva6/sim/Makefile index ca1523ce2..bcceaee51 100644 --- a/cva6/sim/Makefile +++ b/cva6/sim/Makefile @@ -16,6 +16,9 @@ export CVA6_REPO_DIR = $(abspath $(root-dir)../../core-v-cores/cva6/) export CVA6_TB_DIR = $(root-dir)/../tb/core export CORE_V_VERIF = $(root-dir)/../.. endif +ifndef TARGET_CFG +export TARGET_CFG = $(target) +endif .DEFAULT_GOAL := help @@ -23,7 +26,7 @@ FLIST_TB := $(CVA6_TB_DIR)/Flist.cva6_tb # target takes one of the following cva6 hardware configuration: # cv64a6_imafdc_sv39, cv32a6_imac_sv0, cv32a6_imac_sv32, cv32a6_imafc_sv32 target ?= cv64a6_imafdc_sv39 -FLIST_CORE := $(CVA6_REPO_DIR)/core/Flist.$(target) +FLIST_CORE := $(if $(gate), $(CVA6_REPO_DIR)/core/Flist.cva6_gate,$(CVA6_REPO_DIR)/core/Flist.cva6) TRACE_FAST ?= TRACE_COMPACT ?= diff --git a/cva6/sim/cva6.yaml b/cva6/sim/cva6.yaml index 2c91c7cf8..08bf29fa3 100644 --- a/cva6/sim/cva6.yaml +++ b/cva6/sim/cva6.yaml @@ -42,7 +42,7 @@ tool_path: SPIKE_PATH tb_path: TB_PATH cmd: > - make vcs-uvm target=_gate cov=${cov} variant= elf= tool_path= isscomp_opts= issrun_opts= isspostrun_opts= log= + make vcs-uvm target= gate=1 cov=${cov} variant= elf= tool_path= isscomp_opts= issrun_opts= isspostrun_opts= log= - iss: vcs-uvm path_var: RTL_PATH From fbf9275942a58ca7af34d0e336bb1b0ac5cf8f09 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 28 Nov 2022 09:18:59 +0100 Subject: [PATCH 005/183] [VPTOOP][WIP] Create a demonstrator of Design Document handling. * tools/vptool/vptool/vp_pack.py (Item.__init__): Set defaults for Design Doc references: ref mode 'page', viewer 'firefox'. * tools/vptool/vptool/vp.py (MyTextWidget.__init__): Add a grid-based area for design doc information. Include selectors for reference mode (page or section) and for document viewer (firefix or evince). Reduce size of design doc location. Fix typos. (MyTextWidget.vew_file): New. (MyTextWidget.refmode_btn_selected): Ditto. (MyTextWidget.docviewer_btn_selected): Ditto. (MyTextWidget.pack): Do not pack Requirement Location text at the MyText level. (MyTextWidget.update_ref_mode): New. (MyMain.update_desc_widget): Update ref mode state and child widget based on item state. (MyMain.update_ref_mode): New. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 88 ++++++++++++++++++++++++++++++++-- tools/vptool/vptool/vp_pack.py | 4 ++ 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index af214b54d..f6dcf8406 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -557,6 +557,42 @@ class MyTextWidget(ttk.LabelFrame): text=vp_config.yaml_config["gui"]["requirement_loc"]["label"], style="enabled.TLabelframe", ) + # Design doc information uses a grid layout. + # - first row is a URL of the document + # - second row contains selectors for page/section mode and value, and a 'View' button. + self.text1frame.grid(column=0, row=0, padx=20, pady=20) + url_label = ttk.Label(self.text1frame, text="Path or URL", anchor=tk.E) + url_label.grid(column=0, row=0, sticky=tk.E, padx=10, pady=10) + mode_label = ttk.Label(self.text1frame, text="Refer to...", anchor=tk.E) + mode_label.grid(column=0, row=1, sticky=tk.E, padx=10) + self.page_num_var = tk.StringVar(self) + page_entry = ttk.Entry(self.text1frame, textvariable=self.page_num_var, width=4) + page_entry.grid(column=2, row=1, sticky=tk.W) + self.section_num_var= tk.StringVar(self) + section_entry = ttk.Entry(self.text1frame, textvariable=self.section_num_var, width=4) + section_entry.grid(column=2, row=2, sticky=tk.W) + view_btn = ttk.Button(self.text1frame, text="Show design doc", command=self.view_file) + view_btn.grid(column=5, row=2, sticky=tk.E) + self.ref_mode_var = tk.StringVar(self) + ref_mode_names = ("(consecutive) page #", "section #") + ref_mode_values = ("page", "section") + row = 1 + for (name, value) in zip(ref_mode_names, ref_mode_values): + btn = ttk.Radiobutton(self.text1frame, text=name, value=value, variable=self.ref_mode_var, command=self.refmode_btn_selected) + btn.grid(column=1, row=row, sticky=tk.W) + row +=1 + # Label of the viewer selector buttons + viewer_label = ttk.Label(self.text1frame, text="Design doc viewer", anchor=tk.E) + viewer_label.grid(column=3, row=1, sticky=tk.E) + self.viewer_var = tk.StringVar(self) + viewer_names = ("Mozilla Firefox", "Evince PDF viewer") + viewer_values = ("firefox", "evince") + row = 1 + for (name, value) in zip(viewer_names, viewer_values): + btn = ttk.Radiobutton(self.text1frame, text=name, value=value, variable=self.viewer_var, command=self.docviewer_btn_selected) + btn.grid(column=4, row=row, sticky=tk.W) + row += 1 + self.text3frame = ttk.LabelFrame( self, text=vp_config.yaml_config["gui"]["verif_goals"]["label"], @@ -578,7 +614,7 @@ class MyTextWidget(ttk.LabelFrame): style="enabled.TLabelframe", ) # Selectors of verif point properties (PFC, TT, CM) and applicable cores use a layout - # different from the surrounding widgets, so we pack the in a canvas of their own. + # different from the surrounding widgets, so we pack them in a canvas of their own. self.selector_canvas = tk.Canvas(self) self.settings_frame = ttk.LabelFrame( self.selector_canvas, @@ -646,11 +682,12 @@ class MyTextWidget(ttk.LabelFrame): self.text1frame, cue_text=vp_config.yaml_config["gui"]["requirement_loc"]["cue_text"], state="disabled", - height=4, + height=1, bg=BG_COLOR, undo=True, wrap="word", ) + self.text1.grid(column=1, row=0, sticky=tk.W, columnspan=5) self.text3 = MyText( self.text3frame, cue_text=vp_config.yaml_config["gui"]["verif_goals"]["cue_text"], @@ -797,6 +834,41 @@ class MyTextWidget(ttk.LabelFrame): self.bcancel.pack(side="left") self.pack(side, padx, pady) + def view_file(self): + """ + View the requirement file (Design Doc) at the position specified in Requirement Location frame. + """ + print(f"### Calling MyTextWidget.view_file('{self.text1.get(0.0, tk.END).rstrip()}', '#page={self.page_num_var.get()}|#nameddest=section.{self.section_num_var.get()}'" + ) + if self.ref_mode_var.get() == "page": + ref_in_doc = f"#page={self.page_num_var.get().rstrip()}" + elif self.ref_mode_var.get() == "section": + ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" + else: + ref_in_doc = "" + command = "firefox " + \ + self.text1.get(0.0, tk.END).rstrip() + ref_in_doc + print(f"### ==> command = {command}") + os.system(command) + + def refmode_btn_selected(self): + """ + Callback to handle the selection of the Design Doc reference mode. + Sets the value of the corresponding item attribute. + """ + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().ref_mode = self.ref_mode_var.get() + + def docviewer_btn_selected(self): + """ + Callback to handle the selection of the design doc viewer. + Sets the value of the corresponding item attribute. + """ + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().viewer = self.viewer_var.get() + def all_cores_btn_selected(self): print("### self.cores_all.get() = %d" % self.cores_all.get()) if self.cores_all.get() == 1: @@ -910,7 +982,7 @@ class MyTextWidget(ttk.LabelFrame): def pack(self, side, padx, pady): self.text.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) - self.text1.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) + #self.text1.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) self.text3.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) self.text4.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) self.text5.pack(side="top", padx=padx, pady=pady, fill="both", expand=True) @@ -984,6 +1056,10 @@ class MyTextWidget(ttk.LabelFrame): def button_pack_forget(self): self.bframe.pack_forget() + def update_ref_mode(self, mode): + self.ref_mode = mode + self.ref_mode_var.set(mode) + def update_item_tag(self, in_text): self.text6.configure(state="normal") self.text6.delete("1.0", tk.END) @@ -1609,6 +1685,8 @@ class MyMain: self.desc_widget.text5, current_item.coverage_loc ) self.desc_widget.update_item_tag(current_item.tag) + ref_mode = current_item.ref_mode if hasattr(current_item, "ref_mode") else "page" + self.desc_widget.update_ref_mode(ref_mode) pfc = current_item.pfc self.desc_widget.update_pfc(pfc) test_type = current_item.test_type @@ -1652,6 +1730,10 @@ class MyMain: self.update_desc_widget() # reprint current item initial value self.unfreeze_all() + def update_ref_mode(self): + self.get_current_item().ref_mode = self.desc_widget.ref_mode_var.get() + self.desc_widget.update_ref_mode(self.desc_widget.ref_mode_var.get()) + def update_pfc(self): self.get_current_item().pfc = self.desc_widget.pfc.get() self.desc_widget.update_pfc(self.desc_widget.pfc.get()) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index 052d0c6f3..3360f7f27 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -74,6 +74,10 @@ class Item: self.verif_goals = "" # Location of coverage data self.coverage_loc = "" + # Use page as the default reference mode for design docs. + # This will work with all files (no reliance on named dests). + self.ref_mode = "page" + self.viewer = "firefox" # FIXME: Propagate default value from YAML config. self.pfc = -1 # none selected, must choose self.test_type = -1 # none selected, must choose From b5e7c78b870145a3a4ded7937154bf863663015d Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 28 Nov 2022 20:50:53 +0100 Subject: [PATCH 006/183] [VPTOOL] Add fully functional requirement visualization widget. * tools/vptool/vptool/vp.py (MyTextWidget.__init__): Add callback trigger to page and section number fields. (MyTextWidget.ref_page_num_changed): New callback. (MyTextWidget.ref_section_num_changed): Ditto. (MyTextWidget.view_file): Do not print input args on console. Construct command line args according to viewing mode (HTML/PDF). Run command in background to allow editing while viewing the requirement doc. (MyTextWidget.viewer_btn_selected): Rename viewer attribute in Item to 'ref_viewer'. (MyTextWidget.update_page_num): New. (MyTextWidget.update_section_num): Ditto. (MyTextWidget.update_viewer): Ditto. (MyMain.update_desc_widget): Use try/except to detect missing fields in database. (MyMain.update_page_num): New. (MyMain.update_section_num): Ditto. (MyMain.update_viewer): Ditto. * tools/vptool/vptool/vp_pack.py (Item.__init__): Update comments. Rename 'viewer' to 'ref_viewer'. Add defaults for page and section attributes. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 104 ++++++++++++++++++++++++++++----- tools/vptool/vptool/vp_pack.py | 7 ++- 2 files changed, 96 insertions(+), 15 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index f6dcf8406..f171ef3a4 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -568,9 +568,15 @@ class MyTextWidget(ttk.LabelFrame): self.page_num_var = tk.StringVar(self) page_entry = ttk.Entry(self.text1frame, textvariable=self.page_num_var, width=4) page_entry.grid(column=2, row=1, sticky=tk.W) + # Use a callaback to update state upon changes to page number field. + self.page_num_var.trace("w", self.ref_page_num_changed) + self.section_num_var= tk.StringVar(self) section_entry = ttk.Entry(self.text1frame, textvariable=self.section_num_var, width=4) section_entry.grid(column=2, row=2, sticky=tk.W) + # Use a callaback to update state upon changes to section number field. + self.section_num_var.trace("w", self.ref_section_num_changed) + view_btn = ttk.Button(self.text1frame, text="Show design doc", command=self.view_file) view_btn.grid(column=5, row=2, sticky=tk.E) self.ref_mode_var = tk.StringVar(self) @@ -834,22 +840,43 @@ class MyTextWidget(ttk.LabelFrame): self.bcancel.pack(side="left") self.pack(side, padx, pady) + def ref_page_num_changed(self, *args): + """React to change in page number stringvar.""" + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().ref_page = self.page_num_var.get() + + def ref_section_num_changed(self, *args): + """React to change in section number stringvar.""" + current_item = self.parent.item_widget.get_selection() + if current_item and not self.parent.get_current_item().is_locked(): + self.parent.get_current_item().ref_section = self.section_num_var.get() + def view_file(self): """ View the requirement file (Design Doc) at the position specified in Requirement Location frame. """ - print(f"### Calling MyTextWidget.view_file('{self.text1.get(0.0, tk.END).rstrip()}', '#page={self.page_num_var.get()}|#nameddest=section.{self.section_num_var.get()}'" - ) - if self.ref_mode_var.get() == "page": - ref_in_doc = f"#page={self.page_num_var.get().rstrip()}" - elif self.ref_mode_var.get() == "section": - ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" - else: - ref_in_doc = "" - command = "firefox " + \ - self.text1.get(0.0, tk.END).rstrip() + ref_in_doc + if self.viewer_var.get() == "firefox": + # Browser mode: use HREFs with suffix #=. + if self.ref_mode_var.get() == "page": + ref_in_doc = f"#page={self.page_num_var.get().rstrip()}" + elif self.ref_mode_var.get() == "section": + ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" + else: + ref_in_doc = "" + command = [ "firefox", + "file://" + self.text1.get(0.0, tk.END).rstrip() + ref_in_doc ] + elif self.viewer_var.get() == "evince": + # PDF viewer mode: use appropriate cmdline option. + if self.ref_mode_var.get() == "page": + ref_in_doc = ["-i", f"{self.page_num_var.get().rstrip()}" ] + elif self.ref_mode_var.get() == "section": + ref_in_doc = ["-n", f"section.{self.section_num_var.get().rstrip()}"] + else: + ref_in_doc = [] + command = ["evince"] + ref_in_doc + [self.text1.get(0.0, tk.END).rstrip()] print(f"### ==> command = {command}") - os.system(command) + subprocess.Popen(command) def refmode_btn_selected(self): """ @@ -867,7 +894,7 @@ class MyTextWidget(ttk.LabelFrame): """ current_item = self.parent.item_widget.get_selection() if current_item and not self.parent.get_current_item().is_locked(): - self.parent.get_current_item().viewer = self.viewer_var.get() + self.parent.get_current_item().ref_viewer = self.viewer_var.get() def all_cores_btn_selected(self): print("### self.cores_all.get() = %d" % self.cores_all.get()) @@ -1060,6 +1087,18 @@ class MyTextWidget(ttk.LabelFrame): self.ref_mode = mode self.ref_mode_var.set(mode) + def update_page_num(self, page): + self.page_num = page + self.page_num_var.set(page) + + def update_section_num(self, section): + self.section_num = section + self.section_num_var.set(section) + + def update_viewer(self, viewer): + self.viewer = viewer + self.viewer_var.set(viewer) + def update_item_tag(self, in_text): self.text6.configure(state="normal") self.text6.delete("1.0", tk.END) @@ -1685,8 +1724,35 @@ class MyMain: self.desc_widget.text5, current_item.coverage_loc ) self.desc_widget.update_item_tag(current_item.tag) - ref_mode = current_item.ref_mode if hasattr(current_item, "ref_mode") else "page" + # Update mode of reference to location inside design doc. + # DB migration: Assume 'page' as default if the field was not present. + try: + ref_mode = current_item.ref_mode + except AttributeError: + ref_mode = "page" self.desc_widget.update_ref_mode(ref_mode) + # Update page number inside design doc. + # DB migration: Assume empty string as default if the field was not present. + try: + ref_page = current_item.ref_page + except AttributeError: + ref_page = "" + self.desc_widget.update_page_num(ref_page) + # Update section number inside design doc. + # DB migration: Assume empty string as default if the field was not present. + try: + ref_section = current_item.ref_section + except AttributeError: + ref_section = "" + self.desc_widget.update_section_num(ref_section) + # Update name of viewer app that should be used to display the design doc. + # DB migration: Assume empty string as default if the field was not present. + try: + ref_viewer = current_item.ref_viewer + except AttributeError: + ref_viewer = "firefox" + self.desc_widget.update_viewer(ref_viewer) + pfc = current_item.pfc self.desc_widget.update_pfc(pfc) test_type = current_item.test_type @@ -1734,6 +1800,18 @@ class MyMain: self.get_current_item().ref_mode = self.desc_widget.ref_mode_var.get() self.desc_widget.update_ref_mode(self.desc_widget.ref_mode_var.get()) + def update_page_num(self): + self.get_current_item().ref_page = self.desc_widget.page_num_var.get() + self.desc_widget.update_page_num(self.desc_widget.page_num_var.get()) + + def update_section_num(self): + self.get_current_item().ref_section = self.desc_widget.section_num_var.get() + self.desc_widget.update_section_num(self.desc_widget.section_num_var.get()) + + def update_viewer(self): + self.get_current_item().ref_viewer = self.desc_widget.viewer_var.get() + self.desc_widget.update_viewer(self.desc_widget.viewer_var.get()) + def update_pfc(self): self.get_current_item().pfc = self.desc_widget.pfc.get() self.desc_widget.update_pfc(self.desc_widget.pfc.get()) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index 3360f7f27..2f6f9e7bc 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -68,7 +68,8 @@ class Item: self.tag = tag # Description of feature to be tested self.description = description - # Requirement to be verified + # Requirement to be verified (from now on, the design document...) + # FIXME: field naming needs a major rework. self.purpose = purpose # Summary of verification goals self.verif_goals = "" @@ -77,7 +78,9 @@ class Item: # Use page as the default reference mode for design docs. # This will work with all files (no reliance on named dests). self.ref_mode = "page" - self.viewer = "firefox" + self.ref_page = "" + self.ref_section = "" + self.ref_viewer = "firefox" # FIXME: Propagate default value from YAML config. self.pfc = -1 # none selected, must choose self.test_type = -1 # none selected, must choose From 97079a2136953760b3d5f282b6f3785b5fc52c50 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 19 Dec 2022 17:34:47 +0100 Subject: [PATCH 007/183] [VPTOOL] Correctly handle requirement location URLs. * tools/vptool/vptool/vp.py (MyTextWidgegt.view_file): Rename to 'view_design_doc'. Do not prepend "file://" to req't. location unless it is an absolute file name. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index f171ef3a4..bb29befc7 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -577,7 +577,7 @@ class MyTextWidget(ttk.LabelFrame): # Use a callaback to update state upon changes to section number field. self.section_num_var.trace("w", self.ref_section_num_changed) - view_btn = ttk.Button(self.text1frame, text="Show design doc", command=self.view_file) + view_btn = ttk.Button(self.text1frame, text="View design doc", command=self.view_design_doc) view_btn.grid(column=5, row=2, sticky=tk.E) self.ref_mode_var = tk.StringVar(self) ref_mode_names = ("(consecutive) page #", "section #") @@ -852,7 +852,7 @@ class MyTextWidget(ttk.LabelFrame): if current_item and not self.parent.get_current_item().is_locked(): self.parent.get_current_item().ref_section = self.section_num_var.get() - def view_file(self): + def view_design_doc(self): """ View the requirement file (Design Doc) at the position specified in Requirement Location frame. """ @@ -864,8 +864,13 @@ class MyTextWidget(ttk.LabelFrame): ref_in_doc = f"#nameddest=section.{self.section_num_var.get().rstrip()}" else: ref_in_doc = "" - command = [ "firefox", - "file://" + self.text1.get(0.0, tk.END).rstrip() + ref_in_doc ] + # Assume the location is a valid URL or an absolute path. + doc_location = self.text1.get(0.0, tk.END).rstrip() + # If no scheme (http://, file:// etc.) is given, treat it + # as an absolute file path. + if doc_location[0] == '/': + doc_location = "file://" + doc_location + command = [ "firefox", doc_location + ref_in_doc ] elif self.viewer_var.get() == "evince": # PDF viewer mode: use appropriate cmdline option. if self.ref_mode_var.get() == "page": @@ -874,6 +879,7 @@ class MyTextWidget(ttk.LabelFrame): ref_in_doc = ["-n", f"section.{self.section_num_var.get().rstrip()}"] else: ref_in_doc = [] + # The requirement location should be a valid path to a PDF file. command = ["evince"] + ref_in_doc + [self.text1.get(0.0, tk.END).rstrip()] print(f"### ==> command = {command}") subprocess.Popen(command) From 3174e11a7fe0e7018e80eea66cca0efeba3f135b Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Tue, 20 Dec 2022 16:35:11 +0100 Subject: [PATCH 008/183] [VPTOOL] Make design doc URL/path text higher to show multiline content. * tools/vptool/vptool/vp.py (MyTextWidget.__init__): Increase height of "Path or URL" text field to two lines to show potential multiline content and/or long paths. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index bb29befc7..a782de3ee 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -688,7 +688,7 @@ class MyTextWidget(ttk.LabelFrame): self.text1frame, cue_text=vp_config.yaml_config["gui"]["requirement_loc"]["cue_text"], state="disabled", - height=1, + height=2, bg=BG_COLOR, undo=True, wrap="word", From d06d20e54c6dc31729be82041f06410b456a3c49 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 30 Jan 2023 17:26:51 +0100 Subject: [PATCH 009/183] Disable A extension in CV32A60X step1 config. Adapt CVA6 BSP accordingly. * cva/sim/cva6.py (load_config): Disable A extension for cv32a60x config. * cva6/tests/custom/common/syscalls.c (syscall): Do not use synchronization primitives without A extension. * cva6/tests/custom/common/util.h (barrier): Disable functionality when no A extension is present. Signed-off-by: Zbigniew Chamski --- cva6/sim/cva6.py | 2 +- cva6/tests/custom/common/syscalls.c | 4 ++++ cva6/tests/custom/common/util.h | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cva6/sim/cva6.py b/cva6/sim/cva6.py index 433874468..79f441332 100644 --- a/cva6/sim/cva6.py +++ b/cva6/sim/cva6.py @@ -857,7 +857,7 @@ def load_config(args, cwd): args.isa = "rv64gc" elif args.target == "cv32a60x": args.mabi = "ilp32" - args.isa = "rv32imac" # A is needed to compile custom BSP + args.isa = "rv32imc" # Step1 configuration has no A extension. elif args.target == "cv32a6_imac_sv0": args.mabi = "ilp32" args.isa = "rv32imac" diff --git a/cva6/tests/custom/common/syscalls.c b/cva6/tests/custom/common/syscalls.c index 71cfa3300..827de9fce 100644 --- a/cva6/tests/custom/common/syscalls.c +++ b/cva6/tests/custom/common/syscalls.c @@ -22,14 +22,18 @@ static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t magic_mem[1] = arg0; magic_mem[2] = arg1; magic_mem[3] = arg2; +#ifdef __riscv_atomic // __sync_synchronize requires A extension __sync_synchronize(); +#endif tohost = (uintptr_t)magic_mem; while (fromhost == 0) ; fromhost = 0; +#ifdef __riscv_atomic // __sync_synchronize requires A extension __sync_synchronize(); +#endif return magic_mem[0]; } diff --git a/cva6/tests/custom/common/util.h b/cva6/tests/custom/common/util.h index 081cfd634..78fa62401 100644 --- a/cva6/tests/custom/common/util.h +++ b/cva6/tests/custom/common/util.h @@ -43,6 +43,7 @@ static int verifyDouble(int n, const volatile double* test, const double* verify static void __attribute__((noinline)) barrier(int ncores) { +#ifdef __riscv_atomic // __sync_* builtins require A extension static volatile int sense; static volatile int count; static __thread int threadsense; @@ -59,6 +60,7 @@ static void __attribute__((noinline)) barrier(int ncores) ; __sync_synchronize(); +#endif // __riscv_atomic } static uint64_t lfsr(uint64_t x) From ce663f01b26aac1cd491eccfc50a7a46dca21d97 Mon Sep 17 00:00:00 2001 From: Rana Adeel Ahmad Date: Tue, 31 Jan 2023 18:50:56 +0500 Subject: [PATCH 010/183] Documentation for the UVM_Verification Environment for CVA6 core. --- cva6/docs/UVM_verif_env.md | 222 +++++++++++++++++++++++ cva6/docs/images/CVA6_UVM_env.drawio.png | Bin 0 -> 37342 bytes 2 files changed, 222 insertions(+) create mode 100644 cva6/docs/UVM_verif_env.md create mode 100644 cva6/docs/images/CVA6_UVM_env.drawio.png diff --git a/cva6/docs/UVM_verif_env.md b/cva6/docs/UVM_verif_env.md new file mode 100644 index 000000000..ccd58d9c3 --- /dev/null +++ b/cva6/docs/UVM_verif_env.md @@ -0,0 +1,222 @@ + +# The CVA6 UVM Verification Environment + + +This document describes the uvm verification environment of the CVA6 core. This environment is intended to be able to verify the CVA6 core and run different test cases by the minimal modification to the environment itself. The environment is shown below: + +![alt_text](images/CVA6_UVM_env.drawio.png "image_tooltip") + +*** + +This environment consist of the following + +1. Simple two uvm agents for the uvma_clknrst_if and uvma_cvxif_intf . +2. Result checking capability is built into the environment so the test cases do not need to determine and check for the pass/fail criteria. + +The environment consists of disjoint components. When a user invokes a command to run a test case a set of scripts and makefile rules are invoked to compile the environment and tests, run the simulation and check the results. On running a particular test it generates a .bin file which then is loaded into the main memory in the tb_top at the Boot_address of the core and the instructions are then start executing. + +## uvmt_cva6_tb + +In this module we instantiate the agent interfaces and the `uvmt_cva6_dut_wrap` module. We set the interfaces for the uvma_clknrst and uvma_cvxif using the configuration database set method. In this module we get the `sim_finished` database object set in the `uvmt_cva6_base_test_c` class. To check whether the simulation passed or failed we check the `err_count` and `fatal_count` along with `sim_finished`. + +## uvmt_cva6_base_test_c + +This class extends from `uvm_test`. It randomise the `uvmt_cva6_test_cfg_c` and `uvme_cva6_cfg_c` objects. The class's build_phase, connect_phase functions handle the setup and configuration of the testbench environment, connecting it to the CVA6, and executing the test. We start the `uvme_cva6_reset_vseq_c` sequence in the reset phase on the `uvme_cva6_vsqr_c` sequencer. + +## uvme_cva6_env_c + +This class extends from the `uvm_env` class. The class's build_phase,connect_phase functions handle the setup and configuration of the `uvma_clknrst_agent_c`,`uvma_cvxif_agent_c` agents.The class's run_phase task start the `cvxif_seq` sequence on the uvma_cvxif_agent sequencer. We get the configuration and context information for the environment in this class using the get method. + +### Environment_objects + +There are two uvm_objects that are `uvme_cva6_cfg_c` and `uvme_cva6_cntxt_c`. The Objects contain configuration and context information for the environment. + +### uvme_cva6_cfg_c + +This class extends from the `uvm_object` class. The object encapsulates all parameters for creating, connecting and running CVA6 environment (`uvme_cva6_env_c`) components. This class also includes a constraint block that defines default values for some of its fields and other constraints on its fields such as, `enabled` and `is_active` fields are set to 0 and 'UVM_PASSIVE' respectively by default. `clknrst_cfg.enabled` and `clknrst_cfg.is_active` are set to 1 if `enabled` and `is_active` fields are set to 1. `clknrst_cfg.trn_log_enabled` is set to 1 if `trn_log_enabled` is set to 1. `cvxif_cfg.cov_model_enabled` is set to 1 if `cov_model_enabled` is set to 1. + + + + + + + + + + + + + + + + + + + + + + + + + + +
signal + Description +
enabled + is set to 1, the environment is enabled and the components within the environment can be instantiated, built, and connected. +
is_active + This is set to UVM_PASSIVE. +
scoreboarding_enabled + It enables the scoreboard and predictor in the environment class. +
cov_model_enabled + It enables the coverage collection for environment and cvxif_agent. +
trn_log_enabled + It enables the trace log for the clk_rst_agent +
+ +### uvme_cva6_cntxt_c + +The class uvme_cva6_cntxt_c is an object that encapsulates all state variables for CVA6 environment (`uvme_cva6_env_c`) components. It inherits from the `uvm_object` base class.It also contains two events, `sample_cfg_e` and `sample_cntxt_e`, that can be used to synchronize the sampling of configuration and context information. + +### uvme_cva6_vsqr_c + +This class extends from the `uvm_sequencer` base class. It also has two sequencer handles, "clknrst_sequencer" and "cvxif_sequencer" of the types `uvma_clknrst_sqr_c` and `uvma_cvxif_sqr_c`, respectively. This class is used to start the virtual sequence. + +### uvme_cva6_reset_vseq_c + +This class `uvme_cva6_reset_vseq_c` extends a class called `uvme_cva6_base_vseq_c`. The purpose of this sequence is to start the system clock and issue the initial reset pulse to the Device Under Test (DUT). The class has three random variables, `num_clk_before_reset`, `rst_deassert_period`, and `post_rst_wait`. These variables are used to specify the number of clock cycles between the start of the clock and the reset assert.The class has a default constructor and a virtual task called "body" which is responsible for starting the clock, waiting for a specified amount of time, and then resetting the DUT. + +## Clock & Reset Agent + + This agent controls the clock and reset signal of the CVA6 core. + +### uvma_clknrst_if + +The `uvma_clknrst_if` interface has two logic signals, `clk` and `reset_n`. The `clk` signal represents the system clock, while the `reset_n` signal is the active-low reset signal.The interface includes an initial block that contains a forever loop that generates the clock signal, based on the value of `clk_active` and `clk_period`. If `clk_active` is set to 1 and `clk_period` is 0, the function will raise a fatal error. The interface also includes three functions: set_period, which sets the value of `clk_period`; start_clk, which sets `clk_active` to 1; and stop_clk, which sets `clk_active` to 0. + + + + + + + + + + + + + + +
signal + Description +
clk + Controls the Clock fed to the design under test. +
reset_n + Control the reset state of the design under test. +
+ +### uvma_clknrst_uvm_objects + +The uvm_objects `uvma_clknrst_cfg_c` , `uvma_clknrst_cntxt_c` contain the configuration and context information of the uvma_clknrst_agent. + +### uvma_clknrst_seq_item_c + +The class represents an object created by Clock & Reset agent sequences that extend the `uvma_clknrst_seq_base_c` class. + +The class contains several randomized variables: + +* `action` is an enumerated variable of type "uvma_clknrst_seq_item_action_enum" that represents the operation to perform (e.g. start clock, stop clock, assert reset, de-assert reset). +* `initial_value` is an enumerated variable of type "uvma_clknrst_seq_item_initial_value_enum" that represents the initial value of the signals (if starting or asserting). +* `clk_period` is an unsigned 32-bit integer variable representing the period of the clock signal. +* `rst_deassert_period` is an unsigned 32-bit integer variable representing the amount of time (in picoseconds) after which to de-assert reset. +* The class also includes a constraint "default_cons" which sets the default values for `clk_period` to 0 and `rst_deassert_period` to a value defined by `uvma_clknrst_default_rst_deassert_period` + +The class has a default constructor which calls the superclass constructor. + +### uvma_clknrst_Sequence + +It consists of two main sequences: `uvma_clknrst_stop_clk_seq_c` and `uvma_clknrst_restart_clk_seq_c`. + +* The `uvma_clknrst_stop_clk_seq_c` create an instance of the `uvma_clknrst_seq_item_c` and set the its action to the `UVMA_CLKNRST_SEQ_ITEM_ACTION_STOP_CLK` and start and finish the item. + +* The `uvma_clknrst_restart_clk_seq_c` create an instance of the `uvma_clknrst_seq_item_c` and set the its action to the `UVMA_CLKNRST_SEQ_ITEM_ACTION_RESTART_CLK` and start and finish the item. + +### uvma_clknrst_drv_c + +This class `uvma_clknrst_drv_c` is used for driving the interface of the clknrst agent. It get reqs from the sequence item port and calls the `drv_req` task. The `drv_req` task drives the virtual interface's (`cntxt.vif`) signals using req's contents. And then call the write method for the analysis port to send the req transaction to the coverage model. + +### uvma_clknrst_mon_c + +This class `uvma_clknrst_mon_c` is used for monitoring the virtual interface of the Clock & Reset agent. The class extends the `uvm_monitor` class and contains objects for configuration (cfg) and context (cntxt), as well as an analysis port (ap) for transaction analysis.The run_phase() task in the `uvma_clknrst_mon_c` class is responsible for overseeing the monitoring process of the Clock and Reset virtual interface. It does this by executing the monitor_clk() and monitor_reset() tasks in parallel forks. + +### uvma_clknrst_cov_model_c + +This class `uvma_clknrst_cov_model_c` extends from the `uvm_component` base class. The overall functionality of this class is to provide the coverage model for the clknrst_agent. It contains objects for configuration, context, monitor transaction, and sequence item, as well as two analysis FIFOs for holding transactions coming from the monitor and sequence item respectively. This section is in progress. + +### uvma_clknrst_agent_c + + This class `uvma_clknrst_agent_c` extends from `uvm_agent` base class. This class encapsulates ,builds and connects all the other components for driving and monitoring a Clock & reset interface. This class gets the `cfg` , `cntxt` using configuration database get method. It creates a driver,monitor,cov_model and sequencer. This class connects the driver with a sequencer. + +## Cvxif Agent + +Cv-xif agent supports custom instructions. Upon receiving the issue request it drives the response one clock cycle after the issue request. + +### uvma_cvxif_intf + +The interface includes inputs for clock and reset_n signal, as well as two data input/output called `cvxif_req_i` and `cvxif_resp_o`. It includes a clocking block for the monitor `monitor_cb` to sample the `cvxif_req_i` and `cvxif_resp_o` signal at the rising edge of the clock. + + + + + + + + + + + + + +
Enum Variable + Description +
Cvxif_req_i + The request is send to get a response +
Cvxif_resp_o + The response is generated according to the request. +
+ +### uvma_cvxif_uvm_objects + +There are two uvm_objects `uvma_cvxif_cfg_c` and `uvma_cvxif_cntxt_c`. `uvma_cvxif_cfg_c` encapsulates all the parameters for creating ,connecting and running the `uvma_cvxif_agent_c` agent . `uvma_cvxif_cntxt_c` confine all the state variables for all the CVXIF agent components. + +### uvma_cvxif_Sequence_items + +Cvxif agent has two sequence items one `uvma_cvxif_req_item_c`and `uvma_cvxif_resp_item_c` for the request and response transaction. + +### uvma_cvxif_sqr_c + +`uvma_cvxif_sqr_c` class extends from `uvm_sequencer` base class. It is a typical sequencer. This class instantiates a FIFO to receive the `uvma_cvxif_req_item_c`. + +### uvma_cvxif_sequences + +* `uvma_cvxif_base_seq_c` class extends from `uvm_sequence` . This class simply implements a decode function that checks whether the instructions are legal or illegal. + +* `uvma_cvxif_seq_c` class extends from `uvma_cvxif_base_seq_c` class. This class gets the `uvma_cvxif_req_item_c` from the FIFO in sequencer using the p_sequencer handle. In this sequence class, we send the response according to the request item received . If we receive an instruction from the req_item that is illegal then we drive zero's on the response signals. Otherwise we drive response accordingly. + +### uvma_cvxif_drv_c + +This class `uvma_cvxif_drv_c` extends from the `uvm_driver` class. This class has several tasks that perform different actions such as generating a random ready signal, getting response_item, driving an issue response to the `VIF` , driving results in order and out of order fashion, and de-asserting signals. + +### uvma_cvxif_mon_c + +`uvma_cvxif_mon_c` class extends from the `uvm_monitor` . It monitors the virtual interface `vif`. It monitors transaction requests and responses, and sends transaction requests to `uvma_cvxif_sqr_c` and responses to the coverage model. It has several fields, including objects for configuration and context, and analysis ports for transaction requests and responses. + +### uvma_cvxif_cov_model_c + +`uvma_cvxif_cov_model_c` is derived from the `uvm_component` class. This class defines various objects and covergroups with different coverpoints, and it also uses the UVM library to sample these coverpoints and measure coverage.The main purpose of this class is to measure the functional coverage of a specific interface in the design and ensure that it has been fully tested. + +### uvma_cvxif_agent_c + +`uvma_cvxif_agent_c` class extends from `uvm_agent` class. This class represents an agent that is responsible for the test execution and communication between the virtual interface (VIF) and the testbench components. The main role of this class is to create and connect the different components of the testbench and manage the communication between them and the virtual interface (VIF) during the test execution. \ No newline at end of file diff --git a/cva6/docs/images/CVA6_UVM_env.drawio.png b/cva6/docs/images/CVA6_UVM_env.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..151107b7a83a6f7256bd8390c77d50d6c70dd071 GIT binary patch literal 37342 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 literal 0 HcmV?d00001 From 33a848ff6730e43e3d7c59a8d8d083b2f0ec730c Mon Sep 17 00:00:00 2001 From: Nils Wistoff Date: Tue, 31 Jan 2023 14:32:46 +0100 Subject: [PATCH 011/183] cva6/sim/Makefile: Use VCS_HOME env variable Signed-off-by: Nils Wistoff --- cva6/sim/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cva6/sim/Makefile b/cva6/sim/Makefile index bcceaee51..4bd31a3e9 100644 --- a/cva6/sim/Makefile +++ b/cva6/sim/Makefile @@ -158,9 +158,9 @@ export DV_OVPM_HOME = $(CORE_V_VERIF)/$(CV_CORE_LC)/vendor_lib/imperas export DV_OVPM_MODEL = $(DV_OVPM_HOME)/riscv_$(CV_CORE_UC)_OVPsim export DV_OVPM_DESIGN = $(DV_OVPM_HOME)/design -ALL_UVM_FLAGS = -lca -sverilog +incdir+/opt/synopsys/vcs-mx/O-2018.09-SP1-1/etc/uvm/src \ - /opt/synopsys/vcs-mx/O-2018.09-SP1-1/etc/uvm/src/uvm_pkg.sv +UVM_VERBOSITY=UVM_MEDIUM -ntb_opts uvm-1.2 -timescale=1ns/1ps \ - -assert svaext -race=all -ignore unique_checks -full64 -q +incdir+/opt/synopsys/vcs-mx/O-2018.09-SP1-1/etc/uvm/src \ +ALL_UVM_FLAGS = -lca -sverilog +incdir+$(VCS_HOME)/etc/uvm/src \ + $(VCS_HOME)/etc/uvm/src/uvm_pkg.sv +UVM_VERBOSITY=UVM_MEDIUM -ntb_opts uvm-1.2 -timescale=1ns/1ps \ + -assert svaext -race=all -ignore unique_checks -full64 -q +incdir+$(VCS_HOME)/etc/uvm/src \ +incdir+$(CORE_V_VERIF)/$(CV_CORE_LC)/env/uvme +incdir+$(CORE_V_VERIF)/$(CV_CORE_LC)/tb/uvmt \ $(if $(DEBUG), -debug_access+all $(if $(VERDI), -kdb) $(if $(TRACE_COMPACT),+vcs+fsdbon)) From a16b62790905246686529dcc698703d71195cc8f Mon Sep 17 00:00:00 2001 From: Yannick Casamatta Date: Wed, 1 Feb 2023 21:01:51 +0100 Subject: [PATCH 012/183] Update spike log parsing Spike output have been updated in latest releases register index is now left align with space padding --- cva6/sim/cva6_spike_log_to_trace_csv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cva6/sim/cva6_spike_log_to_trace_csv.py b/cva6/sim/cva6_spike_log_to_trace_csv.py index 057364020..486c8d975 100644 --- a/cva6/sim/cva6_spike_log_to_trace_csv.py +++ b/cva6/sim/cva6_spike_log_to_trace_csv.py @@ -28,7 +28,7 @@ from riscv_trace_csv import * from lib import * RD_RE = re.compile(r"(core\s+\d+:\s+)?(?P\d) 0x(?P[a-f0-9]+?) " \ - "\((?P.*?)\)(( c\S* 0x[a-f0-9]+)*) (?P[xf]\s*\d*?) 0x(?P[a-f0-9]+)") + "\((?P.*?)\)(( c\S* 0x[a-f0-9]+)*) (?P[xf]\s*\d*?)\s*0x(?P[a-f0-9]+)") CORE_RE = re.compile( r"core\s+\d+:\s+0x(?P[a-f0-9]+?) \(0x(?P.*?)\) (?P.*?)$") From aa4f0cae20a8afe003c499808cdf6f9deea67e55 Mon Sep 17 00:00:00 2001 From: Ayoub Jalali Date: Thu, 2 Feb 2023 10:31:43 +0100 Subject: [PATCH 013/183] ISACOV: FIX #1582 Signed-off-by: Ayoub Jalali --- lib/uvm_agents/uvma_isacov/uvma_isacov_instr.sv | 15 ++------------- lib/uvm_agents/uvma_isacov/uvma_isacov_mon.sv | 4 ++-- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/lib/uvm_agents/uvma_isacov/uvma_isacov_instr.sv b/lib/uvm_agents/uvma_isacov/uvma_isacov_instr.sv index c790c0178..2347992fb 100644 --- a/lib/uvm_agents/uvma_isacov/uvma_isacov_instr.sv +++ b/lib/uvm_agents/uvma_isacov/uvma_isacov_instr.sv @@ -333,11 +333,6 @@ function void uvma_isacov_instr_c::set_valid_flags(); return; end - if (itype == CSRI_TYPE) begin - rd_valid = 1; - return; - end - endfunction : set_valid_flags @@ -392,7 +387,7 @@ function int uvma_isacov_instr_c::get_field_imm(); if (this.itype == CIW_TYPE) begin return (dasm_rvc_addi4spn_imm(instr) >> 2); // Shift 2 because [9:2] to [7:0] end - if (this.itype == CS_TYPE) begin + if (this.itype == CL_TYPE) begin return (dasm_rvc_lw_imm(instr) >> 2); // Shift 2 because [6:2] to [4:0] end if (this.itype == CB_TYPE) begin @@ -433,13 +428,7 @@ function int uvma_isacov_instr_c::get_field_rd(); // TODO:ropeders is CA handled properly? // TODO:ropeders call dpi_dasm from here, instead of elsewhere? - if (itype inside {CA_TYPE, CB_TYPE}) begin - return rd[2:0]; - end else if (itype inside {CIW_TYPE, CL_TYPE}) begin - return rs2[2:0]; - end else begin - return rd; - end + return (itype inside {CA_TYPE, CL_TYPE, CIW_TYPE, CB_TYPE}) ? rd[2:0] : rd; endfunction : get_field_rd diff --git a/lib/uvm_agents/uvma_isacov/uvma_isacov_mon.sv b/lib/uvm_agents/uvma_isacov/uvma_isacov_mon.sv index 912199318..d32f69e8f 100644 --- a/lib/uvm_agents/uvma_isacov/uvma_isacov_mon.sv +++ b/lib/uvm_agents/uvma_isacov/uvma_isacov_mon.sv @@ -165,8 +165,8 @@ function void uvma_isacov_mon_c::write_rvfi_instr(uvma_rvfi_instr_seq_item_c#(IL if (mon_trn.instr.ext == C_EXT) begin mon_trn.instr.rs1 = dasm_rvc_rs1(instr); mon_trn.instr.rs2 = dasm_rvc_rs2(instr); - mon_trn.instr.rd = dasm_rd(instr); - mon_trn.instr.c_rdrs1 = dasm_rd(instr); + mon_trn.instr.rd = dasm_rvc_rd(instr); + mon_trn.instr.c_rdrs1 = dasm_rvc_rd(instr); mon_trn.instr.c_rs1s = dasm_rvc_rs1s(instr); mon_trn.instr.c_rs2s = dasm_rvc_rs2s(instr); end From 2c48945b869762e9570ba4815342562a0bd87057 Mon Sep 17 00:00:00 2001 From: Ayoub Jalali Date: Fri, 3 Feb 2023 11:32:51 +0100 Subject: [PATCH 014/183] CVXIF: Verification plans Signed-off-by: Ayoub Jalali --- cva6/docs/VerifPlans/CVXIF/VP_IP000.pck | 998 ++++++++++++++++++++ cva6/docs/VerifPlans/CVXIF/VP_IP001.pck | 418 ++++++++ cva6/docs/VerifPlans/CVXIF/VP_IP002.pck | 860 +++++++++++++++++ cva6/docs/VerifPlans/CVXIF/runme.sh | 34 + cva6/docs/VerifPlans/source/dvplan_CVXIF.md | 556 +++++++++++ cva6/docs/VerifPlans/source/index.rst | 1 + 6 files changed, 2867 insertions(+) create mode 100644 cva6/docs/VerifPlans/CVXIF/VP_IP000.pck create mode 100644 cva6/docs/VerifPlans/CVXIF/VP_IP001.pck create mode 100644 cva6/docs/VerifPlans/CVXIF/VP_IP002.pck create mode 100644 cva6/docs/VerifPlans/CVXIF/runme.sh create mode 100644 cva6/docs/VerifPlans/source/dvplan_CVXIF.md diff --git a/cva6/docs/VerifPlans/CVXIF/VP_IP000.pck b/cva6/docs/VerifPlans/CVXIF/VP_IP000.pck new file mode 100644 index 000000000..575c69110 --- /dev/null +++ b/cva6/docs/VerifPlans/CVXIF/VP_IP000.pck @@ -0,0 +1,998 @@ +(VIssue Interface +p0 +ccopy_reg +_reconstructor +p1 +(cvp_pack +Ip +p2 +c__builtin__ +object +p3 +Ntp4 +Rp5 +(dp6 +Vprop_count +p7 +I9 +sVname +p8 +g0 +sVprop_list +p9 +(dp10 +sVip_num +p11 +I0 +sVwid_order +p12 +I0 +sVrfu_dict +p13 +(dp14 +sVrfu_list +p15 +(lp16 +(V000_issue_req signals stable +p17 +g1 +(cvp_pack +Prop +p18 +g3 +Ntp19 +Rp20 +(dp21 +Vitem_count +p22 +I1 +sg8 +g17 +sVtag +p23 +VVP_CVXIF_F000_S000 +p24 +sVitem_list +p25 +(dp26 +sg12 +I0 +sg15 +(lp27 +(V000 +p28 +g1 +(cvp_pack +Item +p29 +g3 +Ntp30 +Rp31 +(dp32 +g8 +V000 +p33 +sg23 +VVP_CVXIF_F000_S000_I000 +p34 +sVdescription +p35 +VThe \u201cinstr\u201d and \u201cmode\u201d signals remain stable during an Issue request transaction. +p36 +sVpurpose +p37 +V +p38 +sVverif_goals +p39 +VCheck that \u201cmode\u201d and \u201cinstr\u201d are stable during an issue transaction (cannot be modified by an instruction when transaction issue is in process) +p40 +sVcoverage_loc +p41 +g38 +sVref_mode +p42 +Vpage +p43 +sVref_page +p44 +g38 +sVref_section +p45 +g38 +sVref_viewer +p46 +Vfirefox +p47 +sVpfc +p48 +I4 +sVtest_type +p49 +I3 +sVcov_method +p50 +I2 +sVcores +p51 +I56 +sVcomments +p52 +g38 +sVstatus +p53 +g38 +sVsimu_target_list +p54 +(lp55 +sg15 +(lp56 +sVrfu_list_2 +p57 +(lp58 +sg13 +(dp59 +Vlock_status +p60 +I0 +ssbtp61 +asVrfu_list_1 +p62 +(lp63 +sg57 +(lp64 +sg13 +(dp65 +sbtp66 +a(V001_mode signal value +p67 +g1 +(g18 +g3 +Ntp68 +Rp69 +(dp70 +g22 +I2 +sg8 +g67 +sg23 +VVP_CVXIF_F000_S001 +p71 +sg25 +(dp72 +sg12 +I1 +sg15 +(lp73 +(V000 +p74 +g1 +(g29 +g3 +Ntp75 +Rp76 +(dp77 +g8 +V000 +p78 +sg23 +VVP_CVXIF_F000_S001_I000 +p79 +sg35 +VWhen issue transaction starts, instruction and current CPU mode are provided +p80 +sg37 +g38 +sg39 +VCheck that a mode modification coming from execution of a first instruction is well provided to the following offloaded instruction +p81 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I3 +sg49 +I3 +sg50 +I1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp82 +sg15 +(lp83 +sg57 +(lp84 +sg13 +(dp85 +g60 +I0 +ssbtp86 +a(V001 +p87 +g1 +(g29 +g3 +Ntp88 +Rp89 +(dp90 +g8 +V001 +p91 +sg23 +VVP_CVXIF_F000_S001_I001 +p92 +sg35 +VCheck \u201cmode\u201d signal values. +p93 +sg37 +g38 +sg39 +VCheck that mode take a value that the CPU supports : Privilege level (2\u2019b00 = User, 2\u2019b01 = Supervisor, 2\u2019b10 = Reserved,\u000a 2\u2019b11 = Machine). +p94 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I-1 +sg49 +I-1 +sg50 +I-1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp95 +sg15 +(lp96 +sg57 +(lp97 +sg13 +(dp98 +g60 +I0 +ssbtp99 +asg62 +(lp100 +sg57 +(lp101 +sg13 +(dp102 +sbtp103 +a(V002_rs_valid signal transition order +p104 +g1 +(g18 +g3 +Ntp105 +Rp106 +(dp107 +g22 +I1 +sg8 +g104 +sg23 +VVP_CVXIF_F000_S002 +p108 +sg25 +(dp109 +sg12 +I2 +sg15 +(lp110 +(V000 +p111 +g1 +(g29 +g3 +Ntp112 +Rp113 +(dp114 +g8 +V000 +p115 +sg23 +VVP_CVXIF_F000_S002_I000 +p116 +sg35 +VDuring a transaction, each bit of \u201crs_valid\u201d can transition from 0 to 1 but are not allowed to transition back to 0. +p117 +sg37 +g38 +sg39 +VFor issue transaction which lasts more than one cycle, check that asserted \u201crs_valid\u201d signals do not transition back to 0.(for i in [0;2] if rs_valid[i] = 1 then rs_valid[i] \u2192 0 cannot happen) +p118 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp119 +sg15 +(lp120 +sg57 +(lp121 +sg13 +(dp122 +g60 +I0 +ssbtp123 +asg62 +(lp124 +sg57 +(lp125 +sg13 +(dp126 +sbtp127 +a(V003_rs signal value +p128 +g1 +(g18 +g3 +Ntp129 +Rp130 +(dp131 +g22 +I3 +sg8 +g128 +sg23 +VVP_CVXIF_F000_S003 +p132 +sg25 +(dp133 +sg12 +I3 +sg15 +(lp134 +(V000 +p135 +g1 +(g29 +g3 +Ntp136 +Rp137 +(dp138 +g8 +V000 +p139 +sg23 +VVP_CVXIF_F000_S003_I000 +p140 +sg35 +VIf XLEN = X_RFR_WIDTH, then rs[X_NUM_RS-1:0] correspond to rs1 and rs2 CPU registers (and rs3 if X_NUM_RS = 3). +p141 +sg37 +g38 +sg39 +VFor every issue transaction check that rs signal correspond to rs1,rs2(rs3) value in CPU register file. +p142 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I3 +sg49 +I3 +sg50 +I1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp143 +sg15 +(lp144 +sg57 +(lp145 +sg13 +(dp146 +g60 +I0 +ssbtp147 +a(V001 +p148 +g1 +(g29 +g3 +Ntp149 +Rp150 +(dp151 +g8 +V001 +p152 +sg23 +VVP_CVXIF_F000_S003_I001 +p153 +sg35 +Vrs signals are only required to be stable during the part of a transaction in which these signals are considered to be valid. +p154 +sg37 +g38 +sg39 +VCheck that rs signals are stable when issue_valid==1 && the corresponding bit in rs_valid is 1. +p155 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I-1 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp156 +sg15 +(lp157 +sg57 +(lp158 +sg13 +(dp159 +g60 +I0 +ssbtp160 +a(V002 +p161 +g1 +(g29 +g3 +Ntp162 +Rp163 +(dp164 +g8 +V002 +p165 +sg23 +VVP_CVXIF_F000_S003_I002 +p166 +sg35 +VIf XLEN != X_RFR_WIDTH , then rs[X_NUM_RS-1:0] correspond to even/odd register pair with rs1, rs2, (rs3) are even register and even register is provided in the 32 lower bits of rs signal. +p167 +sg37 +g38 +sg39 +VFor every issue transaction check that rs signal correspond to the concatenation of rs1/rs1+1,rs2/rs2+1, (rs3/rs3+1) value in CPU register file and even register is in the 32 lower bits of rs. +p168 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I-1 +sg49 +I-1 +sg50 +I-1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp169 +sg15 +(lp170 +sg57 +(lp171 +sg13 +(dp172 +g60 +I0 +ssbtp173 +asg62 +(lp174 +sg57 +(lp175 +sg13 +(dp176 +sbtp177 +a(V004_Default value for unaccepted instruction +p178 +g1 +(g18 +g3 +Ntp179 +Rp180 +(dp181 +g22 +I1 +sg8 +g178 +sg23 +VVP_CVXIF_F000_S004 +p182 +sg25 +(dp183 +sg12 +I4 +sg15 +(lp184 +(V000 +p185 +g1 +(g29 +g3 +Ntp186 +Rp187 +(dp188 +g8 +V000 +p189 +sg23 +VVP_CVXIF_F000_S004_I000 +p190 +sg35 +VIf accept == 0 :\u000aWriteback == 0; dualwrite == 0; dualread == 0; loadstore == 0; exc = 0. +p191 +sg37 +g38 +sg39 +VCheck that for writeback; dualwrite; dualread; loadstore; exc signals if accept == 0 then all those signals are 0. +p192 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp193 +sg15 +(lp194 +sg57 +(lp195 +sg13 +(dp196 +g60 +I0 +ssbtp197 +asg62 +(lp198 +sg57 +(lp199 +sg13 +(dp200 +sbtp201 +a(V005_Illegal Instruction causes +p202 +g1 +(g18 +g3 +Ntp203 +Rp204 +(dp205 +g22 +I1 +sg8 +g202 +sg23 +VVP_CVXIF_F000_S005 +p206 +sg25 +(dp207 +sg12 +I5 +sg15 +(lp208 +(V000 +p209 +g1 +(g29 +g3 +Ntp210 +Rp211 +(dp212 +g8 +V000 +p213 +sg23 +VVP_CVXIF_F000_S005_I000 +p214 +sg35 +VThe CPU shall cause an illegal instruction if:\u000a- an instruction is considered to be valid by the CPU and accepted by the coprocessor (accept = 1)\u000a- neither to be valid by the CPU nor accepted by the coprocessor (accept = 0) +p215 +sg37 +g38 +sg39 +V- CPU causes illegal instruction for instruction accepted by the core and the coprocessor.\u000a- CPU causes illegal instruction exception for instruction that are not valid for coprocessor and CPU +p216 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I3 +sg49 +I3 +sg50 +I1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp217 +sg15 +(lp218 +sg57 +(lp219 +sg13 +(dp220 +g60 +I0 +ssbtp221 +asg62 +(lp222 +sg57 +(lp223 +sg13 +(dp224 +sbtp225 +a(V006_issue uniquness +p226 +g1 +(g18 +g3 +Ntp227 +Rp228 +(dp229 +g22 +I1 +sg8 +g226 +sg23 +VVP_CVXIF_F000_S006 +p230 +sg25 +(dp231 +sg12 +I6 +sg15 +(lp232 +(V000 +p233 +g1 +(g29 +g3 +Ntp234 +Rp235 +(dp236 +g8 +V000 +p237 +sg23 +VVP_CVXIF_F000_S006_I000 +p238 +sg35 +VCheck for issue id validity. +p239 +sg37 +g38 +sg39 +VCheck that the issue interface doesn't issue an "id" that isn't legal to be used (has not fully completed). +p240 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I11 +sg49 +I3 +sg50 +I10 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp241 +sg15 +(lp242 +sg57 +(lp243 +sg13 +(dp244 +g60 +I0 +ssbtp245 +asg62 +(lp246 +sg57 +(lp247 +sg13 +(dp248 +sbtp249 +a(V007_coprocessor decoding +p250 +g1 +(g18 +g3 +Ntp251 +Rp252 +(dp253 +g22 +I1 +sg8 +g250 +sg23 +VVP_CVXIF_F000_S007 +p254 +sg25 +(dp255 +sg12 +I7 +sg15 +(lp256 +(V000 +p257 +g1 +(g29 +g3 +Ntp258 +Rp259 +(dp260 +g8 +V000 +p261 +sg23 +VVP_CVXIF_F000_S007_I000 +p262 +sg35 +VAccept = 1 if: \u000a- coprocessor can handle the instruction based on decoding \u201cinstr\u201dand "mode".\u000a- \u201cissue_valid\u201d == 1 and required bit(s) of \u201crs_valid\u201d are 1. +p263 +sg37 +g38 +sg39 +VTo be checked in coprocessor. +p264 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I3 +sg49 +I3 +sg50 +I1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp265 +sg15 +(lp266 +sg57 +(lp267 +sg13 +(dp268 +g60 +I0 +ssbtp269 +asg62 +(lp270 +sg57 +(lp271 +sg13 +(dp272 +sbtp273 +a(V008_Transaction definition +p274 +g1 +(g18 +g3 +Ntp275 +Rp276 +(dp277 +g22 +I1 +sg8 +g274 +sg23 +VVP_CVXIF_F000_S008 +p278 +sg25 +(dp279 +sg12 +I8 +sg15 +(lp280 +(V000 +p281 +g1 +(g29 +g3 +Ntp282 +Rp283 +(dp284 +g8 +V000 +p285 +sg23 +VVP_CVXIF_F000_S008_I000 +p286 +sg35 +V\u201cissue_resp\u201d signals and \u201cissue_req\u201d signals are accepted when \u201cissue_valid\u201d == \u201cissue_ready\u201d == 1\u000a\u201cissue_resp\u201d is valid when "valid==ready==1".\u000a\u201cissue_req\u201d is valid when "valid==1" +p287 +sg37 +g38 +sg39 +VThe definition of a transaction. \u000aNot to be verified. +p288 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I11 +sg49 +I10 +sg50 +I10 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp289 +sg15 +(lp290 +sg57 +(lp291 +sg13 +(dp292 +g60 +I0 +ssbtp293 +asg62 +(lp294 +sg57 +(lp295 +sg13 +(dp296 +sbtp297 +asVrfu_list_0 +p298 +(lp299 +sg62 +(lp300 +sVvptool_gitrev +p301 +V$Id: a782de3eec3de5ff99661fb165c09f541b4228d0 $ +p302 +sVio_fmt_gitrev +p303 +V$Id: 2f6f9e7bc800d8b831382463dc706473c6c6ad8c $ +p304 +sVconfig_gitrev +p305 +V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ +p306 +sVymlcfg_gitrev +p307 +V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ +p308 +sbtp309 +. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/CVXIF/VP_IP001.pck b/cva6/docs/VerifPlans/CVXIF/VP_IP001.pck new file mode 100644 index 000000000..1a42a8fd3 --- /dev/null +++ b/cva6/docs/VerifPlans/CVXIF/VP_IP001.pck @@ -0,0 +1,418 @@ +(VCommit Interface +p0 +ccopy_reg +_reconstructor +p1 +(cvp_pack +Ip +p2 +c__builtin__ +object +p3 +Ntp4 +Rp5 +(dp6 +Vprop_count +p7 +I4 +sVname +p8 +g0 +sVprop_list +p9 +(dp10 +sVip_num +p11 +I1 +sVwid_order +p12 +I1 +sVrfu_dict +p13 +(dp14 +sVrfu_list +p15 +(lp16 +(V000_commit_valid pulse +p17 +g1 +(cvp_pack +Prop +p18 +g3 +Ntp19 +Rp20 +(dp21 +Vitem_count +p22 +I1 +sg8 +g17 +sVtag +p23 +VVP_CVXIF_F001_S000 +p24 +sVitem_list +p25 +(dp26 +sg12 +I0 +sg15 +(lp27 +(V000 +p28 +g1 +(cvp_pack +Item +p29 +g3 +Ntp30 +Rp31 +(dp32 +g8 +V000 +p33 +sg23 +VVP_CVXIF_F001_S000_I000 +p34 +sVdescription +p35 +VThe \u201ccommit_valid\u201d == 1 exactly one clk cycle for every offloaded Instruction by the coprocessor (whether accepted or not). +p36 +sVpurpose +p37 +V +p38 +sVverif_goals +p39 +VFor every offloaded instruction, check that commit_valid is asserted exactly one clk cycle ( is a pulse ). +p40 +sVcoverage_loc +p41 +g38 +sVref_mode +p42 +Vpage +p43 +sVref_page +p44 +g38 +sVref_section +p45 +g38 +sVref_viewer +p46 +Vfirefox +p47 +sVpfc +p48 +I4 +sVtest_type +p49 +I3 +sVcov_method +p50 +I2 +sVcores +p51 +I56 +sVcomments +p52 +g38 +sVstatus +p53 +g38 +sVsimu_target_list +p54 +(lp55 +sg15 +(lp56 +sVrfu_list_2 +p57 +(lp58 +sg13 +(dp59 +Vlock_status +p60 +I0 +ssbtp61 +asVrfu_list_1 +p62 +(lp63 +sg57 +(lp64 +sg13 +(dp65 +sbtp66 +a(V001_commit transaction uniquness +p67 +g1 +(g18 +g3 +Ntp68 +Rp69 +(dp70 +g22 +I1 +sg8 +g67 +sg23 +VVP_CVXIF_F001_S001 +p71 +sg25 +(dp72 +sg12 +I1 +sg15 +(lp73 +(V000 +p74 +g1 +(g29 +g3 +Ntp75 +Rp76 +(dp77 +g8 +V000 +p78 +sg23 +VVP_CVXIF_F001_S001_I000 +p79 +sg35 +VThere is a unique commit transaction for every issue transaction (unique until an instruction has "fully completed" = its result has been submitted). +p80 +sg37 +g38 +sg39 +VCheck that the commit interface doesn't commit an "id" that isn't legal to be used (hasn't been seen in earlier stages, or has not fully completed). +p81 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I1 +sg49 +I10 +sg50 +I10 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp82 +sg15 +(lp83 +sg57 +(lp84 +sg13 +(dp85 +g60 +I0 +ssbtp86 +asg62 +(lp87 +sg57 +(lp88 +sg13 +(dp89 +sbtp90 +a(V002_commit transaction for every issue transaction +p91 +g1 +(g18 +g3 +Ntp92 +Rp93 +(dp94 +g22 +I1 +sg8 +g91 +sg23 +VVP_CVXIF_F001_S002 +p95 +sg25 +(dp96 +sg12 +I2 +sg15 +(lp97 +(V000 +p98 +g1 +(g29 +g3 +Ntp99 +Rp100 +(dp101 +g8 +V000 +p102 +sg23 +VVP_CVXIF_F001_S002_I000 +p103 +sg35 +V- The CPU shall perform a commit transaction for every issue transaction, independent of the accept value of the issue transaction.\u000a- For each offloaded and accepted instruction the core is guaranteed to (eventually) signal that such an instruction is either no longer speculative and can be committed (commit_valid is 1 and commit_kill is 0) or that the instruction must be killed (commit_valid is 1 and commit_kill is 1). +p104 +sg37 +g38 +sg39 +VCheck that for each issue transaction, the commit transaction is sent at the same clock cycle than the issue transaction, or at any clock cycle after the issue transaction. +p105 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp106 +sg15 +(lp107 +sg57 +(lp108 +sg13 +(dp109 +g60 +I0 +ssbtp110 +asg62 +(lp111 +sg57 +(lp112 +sg13 +(dp113 +sbtp114 +a(V003_Transaction definition +p115 +g1 +(g18 +g3 +Ntp116 +Rp117 +(dp118 +g22 +I1 +sg8 +g115 +sg23 +VVP_CVXIF_F001_S003 +p119 +sg25 +(dp120 +sg12 +I3 +sg15 +(lp121 +(V000 +p122 +g1 +(g29 +g3 +Ntp123 +Rp124 +(dp125 +g8 +V000 +p126 +sg23 +VVP_CVXIF_F001_S003_I000 +p127 +sg35 +VThe signals in commit are valid when commit_valid is 1. +p128 +sg37 +g38 +sg39 +VThe definition of a transaction.\u000aNot to be verified. +p129 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I11 +sg49 +I-1 +sg50 +I10 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp130 +sg15 +(lp131 +sg57 +(lp132 +sg13 +(dp133 +g60 +I0 +ssbtp134 +asg62 +(lp135 +sg57 +(lp136 +sg13 +(dp137 +sbtp138 +asVrfu_list_0 +p139 +(lp140 +sg62 +(lp141 +sVvptool_gitrev +p142 +V$Id: a782de3eec3de5ff99661fb165c09f541b4228d0 $ +p143 +sVio_fmt_gitrev +p144 +V$Id: 2f6f9e7bc800d8b831382463dc706473c6c6ad8c $ +p145 +sVconfig_gitrev +p146 +V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ +p147 +sVymlcfg_gitrev +p148 +V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ +p149 +sbtp150 +. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/CVXIF/VP_IP002.pck b/cva6/docs/VerifPlans/CVXIF/VP_IP002.pck new file mode 100644 index 000000000..7211f1b9e --- /dev/null +++ b/cva6/docs/VerifPlans/CVXIF/VP_IP002.pck @@ -0,0 +1,860 @@ +(VResult Interface +p0 +ccopy_reg +_reconstructor +p1 +(cvp_pack +Ip +p2 +c__builtin__ +object +p3 +Ntp4 +Rp5 +(dp6 +Vprop_count +p7 +I8 +sVname +p8 +g0 +sVprop_list +p9 +(dp10 +sVip_num +p11 +I2 +sVwid_order +p12 +I2 +sVrfu_dict +p13 +(dp14 +sVrfu_list +p15 +(lp16 +(V000_no speculative result transaction +p17 +g1 +(cvp_pack +Prop +p18 +g3 +Ntp19 +Rp20 +(dp21 +Vitem_count +p22 +I1 +sg8 +g17 +sVtag +p23 +VVP_CVXIF_F002_S000 +p24 +sVitem_list +p25 +(dp26 +sg12 +I0 +sg15 +(lp27 +(V000 +p28 +g1 +(cvp_pack +Item +p29 +g3 +Ntp30 +Rp31 +(dp32 +g8 +V000 +p33 +sg23 +VVP_CVXIF_F002_S000_I000 +p34 +sVdescription +p35 +VA coprocessor is not allowed to perform speculative result transactions. +p36 +sVpurpose +p37 +V +p38 +sVverif_goals +p39 +VThere is no result transaction for instructions that haven't been committed. Check that Result valid is only asserted for instructions that were committed (commit_valid == 1 && commit_kill == 0). +p40 +sVcoverage_loc +p41 +g38 +sVref_mode +p42 +Vpage +p43 +sVref_page +p44 +g38 +sVref_section +p45 +g38 +sVref_viewer +p46 +Vfirefox +p47 +sVpfc +p48 +I11 +sVtest_type +p49 +I10 +sVcov_method +p50 +I10 +sVcores +p51 +I56 +sVcomments +p52 +g38 +sVstatus +p53 +g38 +sVsimu_target_list +p54 +(lp55 +sg15 +(lp56 +sVrfu_list_2 +p57 +(lp58 +sg13 +(dp59 +Vlock_status +p60 +I0 +ssbtp61 +asVrfu_list_1 +p62 +(lp63 +sg57 +(lp64 +sg13 +(dp65 +sbtp66 +a(V001_out of order result transaction +p67 +g1 +(g18 +g3 +Ntp68 +Rp69 +(dp70 +g22 +I1 +sg8 +g67 +sg23 +VVP_CVXIF_F002_S001 +p71 +sg25 +(dp72 +sg12 +I1 +sg15 +(lp73 +(V000 +p74 +g1 +(g29 +g3 +Ntp75 +Rp76 +(dp77 +g8 +V000 +p78 +sg23 +VVP_CVXIF_F002_S001_I000 +p79 +sg35 +VA coprocessor is allowed to provide results to the core in an out of order fashion. +p80 +sg37 +g38 +sg39 +VCheck that the CPU is able to receive the result in an out of order fashion. +p81 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I3 +sg49 +I3 +sg50 +I1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp82 +sg15 +(lp83 +sg57 +(lp84 +sg13 +(dp85 +g60 +I0 +ssbtp86 +asg62 +(lp87 +sg57 +(lp88 +sg13 +(dp89 +sbtp90 +a(V002_result transaction uniquness +p91 +g1 +(g18 +g3 +Ntp92 +Rp93 +(dp94 +g22 +I1 +sg8 +g91 +sg23 +VVP_CVXIF_F002_S002 +p95 +sg25 +(dp96 +sg12 +I2 +sg15 +(lp97 +(V000 +p98 +g1 +(g29 +g3 +Ntp99 +Rp100 +(dp101 +g8 +V000 +p102 +sg23 +VVP_CVXIF_F002_S002_I000 +p103 +sg35 +VEach accepted offloaded (committed and not killed) instruction shall have exactly one result group transaction (even if no data needs to be written back to the CPU\u2019s register file). +p104 +sg37 +g38 +sg39 +VThere is an unique result transaction for every accepted and commit instruction. +p105 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I11 +sg49 +I10 +sg50 +I10 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp106 +sg15 +(lp107 +sg57 +(lp108 +sg13 +(dp109 +g60 +I0 +ssbtp110 +asg62 +(lp111 +sg57 +(lp112 +sg13 +(dp113 +sbtp114 +a(V003_result packet stability +p115 +g1 +(g18 +g3 +Ntp116 +Rp117 +(dp118 +g22 +I1 +sg8 +g115 +sg23 +VVP_CVXIF_F002_S003 +p119 +sg25 +(dp120 +sg12 +I3 +sg15 +(lp121 +(V000 +p122 +g1 +(g29 +g3 +Ntp123 +Rp124 +(dp125 +g8 +V000 +p126 +sg23 +VVP_CVXIF_F002_S003_I000 +p127 +sg35 +VThe signals in result shall remain stable during a result transaction (except data ...) +p128 +sg37 +g38 +sg39 +VCheck that result signals (except data) are stable during result transaction (result_valid==1 jusqu'à valid==ready ==1) +p129 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp130 +sg15 +(lp131 +sg57 +(lp132 +sg13 +(dp133 +g60 +I0 +ssbtp134 +asg62 +(lp135 +sg57 +(lp136 +sg13 +(dp137 +sbtp138 +a(V004_data stability +p139 +g1 +(g18 +g3 +Ntp140 +Rp141 +(dp142 +g22 +I1 +sg8 +g139 +sg23 +VVP_CVXIF_F002_S004 +p143 +sg25 +(dp144 +sg12 +I4 +sg15 +(lp145 +(V000 +p146 +g1 +(g29 +g3 +Ntp147 +Rp148 +(dp149 +g8 +V000 +p150 +sg23 +VVP_CVXIF_F002_S004_I000 +p151 +sg35 +VData is only required to remain stable during result transactions in which "we" is not 0. +p152 +sg37 +g38 +sg39 +VCheck that "data" remains stable when we==1. +p153 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp154 +sg15 +(lp155 +sg57 +(lp156 +sg13 +(dp157 +g60 +I0 +ssbtp158 +asg62 +(lp159 +sg57 +(lp160 +sg13 +(dp161 +sbtp162 +a(V005_synchronous exception +p163 +g1 +(g18 +g3 +Ntp164 +Rp165 +(dp166 +g22 +I3 +sg8 +g163 +sg23 +VVP_CVXIF_F002_S005 +p167 +sg25 +(dp168 +sg12 +I5 +sg15 +(lp169 +(V000 +p170 +g1 +(g29 +g3 +Ntp171 +Rp172 +(dp173 +g8 +V000 +p174 +sg23 +VVP_CVXIF_F002_S005_I000 +p175 +sg35 +VThe exc is used to signal synchronous exceptions. A synchronous exception will lead to a trap in CPU unless the corresponding instruction is killed. +p176 +sg37 +g38 +sg39 +VCheck that synchronous exception (exc ==1) leads to a trap in the CPU if the instruction is committed. +p177 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I3 +sg49 +I3 +sg50 +I1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp178 +sg15 +(lp179 +sg57 +(lp180 +sg13 +(dp181 +g60 +I0 +ssbtp182 +a(V001 +p183 +g1 +(g29 +g3 +Ntp184 +Rp185 +(dp186 +g8 +V001 +p187 +sg23 +VVP_CVXIF_F002_S005_I001 +p188 +sg35 +Vexccode provides the least significant bits of the exception code bitfield of the mcause CSR. +p189 +sg37 +g38 +sg39 +VCheck that exccode signal is the value of the mcause CSR when exc == 1. +p190 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I-1 +sg49 +I-1 +sg50 +I-1 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp191 +sg15 +(lp192 +sg57 +(lp193 +sg13 +(dp194 +g60 +I0 +ssbtp195 +a(V002 +p196 +g1 +(g29 +g3 +Ntp197 +Rp198 +(dp199 +g8 +V002 +p200 +sg23 +VVP_CVXIF_F002_S005_I002 +p201 +sg35 +V "we" shall be driven to 0 by the coprocessor for synchronous exceptions. +p202 +sg37 +g38 +sg39 +VCheck that "we" signal == 0 when exc == 1. +p203 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I-1 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp204 +sg15 +(lp205 +sg57 +(lp206 +sg13 +(dp207 +g60 +I0 +ssbtp208 +asg62 +(lp209 +sg57 +(lp210 +sg13 +(dp211 +sbtp212 +a(V006_"we" value when dualwrite +p213 +g1 +(g18 +g3 +Ntp214 +Rp215 +(dp216 +g22 +I1 +sg8 +g213 +sg23 +VVP_CVXIF_F002_S006 +p217 +sg25 +(dp218 +sg12 +I6 +sg15 +(lp219 +(V000 +p220 +g1 +(g29 +g3 +Ntp221 +Rp222 +(dp223 +g8 +V000 +p224 +sg23 +VVP_CVXIF_F002_S006_I000 +p225 +sg35 +Vwe is 2 bits wide when XLEN` = 32 and X_RFW_WIDTH = 64, and 1 bit wide otherwise. If "we" is 2 bits wide, then we[1] is only allowed to be 1 if we[0] is 1 as well (i.e. for dual writeback). +p226 +sg37 +g38 +sg39 +VFor dualwrite instruction, check that we[1]==1 is only allowed if we[0] == 1. +p227 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp228 +sg15 +(lp229 +sg57 +(lp230 +sg13 +(dp231 +g60 +I0 +ssbtp232 +asg62 +(lp233 +sg57 +(lp234 +sg13 +(dp235 +sbtp236 +a(V007_proper result transaction +p237 +g1 +(g18 +g3 +Ntp238 +Rp239 +(dp240 +g22 +I1 +sg8 +g237 +sg23 +VVP_CVXIF_F002_S007 +p241 +sg25 +(dp242 +sg12 +I7 +sg15 +(lp243 +(V000 +p244 +g1 +(g29 +g3 +Ntp245 +Rp246 +(dp247 +g8 +V000 +p248 +sg23 +VVP_CVXIF_F002_S007_I000 +p249 +sg35 +VResult transaction starts in the cycle that result_valid = 1 and ends in the cycle that both result_valid == result_ready == 1. +p250 +sg37 +g38 +sg39 +VCheck that result transaction ends properly. +p251 +sg41 +g38 +sg42 +g43 +sg44 +g38 +sg45 +g38 +sg46 +g47 +sg48 +I4 +sg49 +I3 +sg50 +I2 +sg51 +I56 +sg52 +g38 +sg53 +g38 +sg54 +(lp252 +sg15 +(lp253 +sg57 +(lp254 +sg13 +(dp255 +g60 +I0 +ssbtp256 +asg62 +(lp257 +sg57 +(lp258 +sg13 +(dp259 +sbtp260 +asVrfu_list_0 +p261 +(lp262 +sg62 +(lp263 +sVvptool_gitrev +p264 +V$Id: a782de3eec3de5ff99661fb165c09f541b4228d0 $ +p265 +sVio_fmt_gitrev +p266 +V$Id: 2f6f9e7bc800d8b831382463dc706473c6c6ad8c $ +p267 +sVconfig_gitrev +p268 +V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ +p269 +sVymlcfg_gitrev +p270 +V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ +p271 +sbtp272 +. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/CVXIF/runme.sh b/cva6/docs/VerifPlans/CVXIF/runme.sh new file mode 100644 index 000000000..f1be65625 --- /dev/null +++ b/cva6/docs/VerifPlans/CVXIF/runme.sh @@ -0,0 +1,34 @@ +############################################################################# +# Copyright (C) 2022 Thales DIS France SAS +# +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0. +# +# Original Author: Zbigniew Chamski (zbigniew.chamski@thalesgroup.com) +############################################################################# +#!/bin/sh + +# Location of project-specific directories +ROOTDIR=`readlink -f $(dirname "${BASH_SOURCE[0]}")` + +# Set up platform location. It can be anywhere but should contain +# a valid `vp_config.py` file in `vptool` directory. +# Here we use the verification tree from the example directory. +export PLATFORM_TOP_DIR="$ROOTDIR" + +# Set the printable name for the project that will be used +# in the human-readable documentation. +export PROJECT_NAME="CVXIF" + +# Set the alphanumerical identifier of the project that +# will be used to construct file names etc. +export PROJECT_IDENT="CVXIF" + +# Set the destination directory of Markdown files for this project. +# Since it will be used by VPTOOL, it shall NOT be a relative path. +export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` + +# Run VPTOOL overriding the default theme from Yaml config with 'winxpblue'. +# FIXME: Introduce a suitably named shell variable that points to the root +# directory of the tool set (TOOL_TOP etc.) +# FORNOW use a hardcoded relative path. +python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py -t winxpblue diff --git a/cva6/docs/VerifPlans/source/dvplan_CVXIF.md b/cva6/docs/VerifPlans/source/dvplan_CVXIF.md new file mode 100644 index 000000000..24d31a54e --- /dev/null +++ b/cva6/docs/VerifPlans/source/dvplan_CVXIF.md @@ -0,0 +1,556 @@ +# Module: CVXIF + +## Feature: Issue Interface + +### Sub-feature: 000_issue_req signals stable + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + The “instr†and “mode†signals remain stable during an Issue request transaction. +* **Verification Goals** + + Check that “mode†and “instr†are stable during an issue transaction (cannot be modified by an instruction when transaction issue is in process) +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 001_mode signal value + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + When issue transaction starts, instruction and current CPU mode are provided +* **Verification Goals** + + Check that a mode modification coming from execution of a first instruction is well provided to the following offloaded instruction +* **Pass/Fail Criteria:** Check RM +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S001_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** +* **Feature Description** + + Check “mode†signal values. +* **Verification Goals** + + Check that mode take a value that the CPU supports : Privilege level (2’b00 = User, 2’b01 = Supervisor, 2’b10 = Reserved, + 2’b11 = Machine). +* **Pass/Fail Criteria:** NDY (Not Defined Yet) +* **Test Type:** NDY (Not Defined Yet) +* **Coverage Method:** NDY (Not Defined Yet) +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S001_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 002_rs_valid signal transition order + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + During a transaction, each bit of “rs_valid†can transition from 0 to 1 but are not allowed to transition back to 0. +* **Verification Goals** + + For issue transaction which lasts more than one cycle, check that asserted “rs_valid†signals do not transition back to 0.(for i in [0;2] if rs_valid[i] = 1 then rs_valid[i] → 0 cannot happen) +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S002_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 003_rs signal value + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + If XLEN = X_RFR_WIDTH, then rs[X_NUM_RS-1:0] correspond to rs1 and rs2 CPU registers (and rs3 if X_NUM_RS = 3). +* **Verification Goals** + + For every issue transaction check that rs signal correspond to rs1,rs2(rs3) value in CPU register file. +* **Pass/Fail Criteria:** Check RM +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S003_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** +* **Feature Description** + + rs signals are only required to be stable during the part of a transaction in which these signals are considered to be valid. +* **Verification Goals** + + Check that rs signals are stable when issue_valid==1 && the corresponding bit in rs_valid is 1. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** NDY (Not Defined Yet) +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S003_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 002 + +* **Requirement location:** +* **Feature Description** + + If XLEN != X_RFR_WIDTH , then rs[X_NUM_RS-1:0] correspond to even/odd register pair with rs1, rs2, (rs3) are even register and even register is provided in the 32 lower bits of rs signal. +* **Verification Goals** + + For every issue transaction check that rs signal correspond to the concatenation of rs1/rs1+1,rs2/rs2+1, (rs3/rs3+1) value in CPU register file and even register is in the 32 lower bits of rs. +* **Pass/Fail Criteria:** NDY (Not Defined Yet) +* **Test Type:** NDY (Not Defined Yet) +* **Coverage Method:** NDY (Not Defined Yet) +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S003_I002 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 004_Default value for unaccepted instruction + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + If accept == 0 : + Writeback == 0; dualwrite == 0; dualread == 0; loadstore == 0; exc = 0. +* **Verification Goals** + + Check that for writeback; dualwrite; dualread; loadstore; exc signals if accept == 0 then all those signals are 0. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S004_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 005_Illegal Instruction causes + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + The CPU shall cause an illegal instruction if: + - an instruction is considered to be valid by the CPU and accepted by the coprocessor (accept = 1) + - neither to be valid by the CPU nor accepted by the coprocessor (accept = 0) +* **Verification Goals** + + - CPU causes illegal instruction for instruction accepted by the core and the coprocessor. + - CPU causes illegal instruction exception for instruction that are not valid for coprocessor and CPU +* **Pass/Fail Criteria:** Check RM +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S005_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 006_issue uniquness + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + Check for issue id validity. +* **Verification Goals** + + Check that the issue interface doesn't issue an "id" that isn't legal to be used (has not fully completed). +* **Pass/Fail Criteria:** Other +* **Test Type:** Constrained Random +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S006_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 007_coprocessor decoding + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + Accept = 1 if: + - coprocessor can handle the instruction based on decoding “instrâ€and "mode". + - “issue_valid†== 1 and required bit(s) of “rs_valid†are 1. +* **Verification Goals** + + To be checked in coprocessor. +* **Pass/Fail Criteria:** Check RM +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S007_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 008_Transaction definition + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + “issue_resp†signals and “issue_req†signals are accepted when “issue_valid†== “issue_ready†== 1 + “issue_resp†is valid when "valid==ready==1". + “issue_req†is valid when "valid==1" +* **Verification Goals** + + The definition of a transaction. + Not to be verified. +* **Pass/Fail Criteria:** Other +* **Test Type:** Other +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F000_S008_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +## Feature: Commit Interface + +### Sub-feature: 000_commit_valid pulse + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + The “commit_valid†== 1 exactly one clk cycle for every offloaded Instruction by the coprocessor (whether accepted or not). +* **Verification Goals** + + For every offloaded instruction, check that commit_valid is asserted exactly one clk cycle ( is a pulse ). +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F001_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 001_commit transaction uniquness + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + There is a unique commit transaction for every issue transaction (unique until an instruction has "fully completed" = its result has been submitted). +* **Verification Goals** + + Check that the commit interface doesn't commit an "id" that isn't legal to be used (hasn't been seen in earlier stages, or has not fully completed). +* **Pass/Fail Criteria:** Self-Check +* **Test Type:** Other +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F001_S001_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 002_commit transaction for every issue transaction + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + - The CPU shall perform a commit transaction for every issue transaction, independent of the accept value of the issue transaction. + - For each offloaded and accepted instruction the core is guaranteed to (eventually) signal that such an instruction is either no longer speculative and can be committed (commit_valid is 1 and commit_kill is 0) or that the instruction must be killed (commit_valid is 1 and commit_kill is 1). +* **Verification Goals** + + Check that for each issue transaction, the commit transaction is sent at the same clock cycle than the issue transaction, or at any clock cycle after the issue transaction. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F001_S002_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 003_Transaction definition + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + The signals in commit are valid when commit_valid is 1. +* **Verification Goals** + + The definition of a transaction. + Not to be verified. +* **Pass/Fail Criteria:** Other +* **Test Type:** NDY (Not Defined Yet) +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F001_S003_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +## Feature: Result Interface + +### Sub-feature: 000_no speculative result transaction + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + A coprocessor is not allowed to perform speculative result transactions. +* **Verification Goals** + + There is no result transaction for instructions that haven't been committed. Check that Result valid is only asserted for instructions that were committed (commit_valid == 1 && commit_kill == 0). +* **Pass/Fail Criteria:** Other +* **Test Type:** Other +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 001_out of order result transaction + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + A coprocessor is allowed to provide results to the core in an out of order fashion. +* **Verification Goals** + + Check that the CPU is able to receive the result in an out of order fashion. +* **Pass/Fail Criteria:** Check RM +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S001_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 002_result transaction uniquness + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + Each accepted offloaded (committed and not killed) instruction shall have exactly one result group transaction (even if no data needs to be written back to the CPU’s register file). +* **Verification Goals** + + There is an unique result transaction for every accepted and commit instruction. +* **Pass/Fail Criteria:** Other +* **Test Type:** Other +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S002_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 003_result packet stability + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + The signals in result shall remain stable during a result transaction (except data ...) +* **Verification Goals** + + Check that result signals (except data) are stable during result transaction (result_valid==1 jusqu'Ă  valid==ready ==1) +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S003_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 004_data stability + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + Data is only required to remain stable during result transactions in which "we" is not 0. +* **Verification Goals** + + Check that "data" remains stable when we==1. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S004_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 005_synchronous exception + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + The exc is used to signal synchronous exceptions. A synchronous exception will lead to a trap in CPU unless the corresponding instruction is killed. +* **Verification Goals** + + Check that synchronous exception (exc ==1) leads to a trap in the CPU if the instruction is committed. +* **Pass/Fail Criteria:** Check RM +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S005_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** +* **Feature Description** + + exccode provides the least significant bits of the exception code bitfield of the mcause CSR. +* **Verification Goals** + + Check that exccode signal is the value of the mcause CSR when exc == 1. +* **Pass/Fail Criteria:** NDY (Not Defined Yet) +* **Test Type:** NDY (Not Defined Yet) +* **Coverage Method:** NDY (Not Defined Yet) +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S005_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 002 + +* **Requirement location:** +* **Feature Description** + +  "we" shall be driven to 0 by the coprocessor for synchronous exceptions. +* **Verification Goals** + + Check that "we" signal == 0 when exc == 1. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** NDY (Not Defined Yet) +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S005_I002 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 006_"we" value when dualwrite + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + we is 2 bits wide when XLEN` = 32 and X_RFW_WIDTH = 64, and 1 bit wide otherwise. If "we" is 2 bits wide, then we[1] is only allowed to be 1 if we[0] is 1 as well (i.e. for dual writeback). +* **Verification Goals** + + For dualwrite instruction, check that we[1]==1 is only allowed if we[0] == 1. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S006_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 007_proper result transaction + +#### Item: 000 + +* **Requirement location:** +* **Feature Description** + + Result transaction starts in the cycle that result_valid = 1 and ends in the cycle that both result_valid == result_ready == 1. +* **Verification Goals** + + Check that result transaction ends properly. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_CVXIF_F002_S007_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + diff --git a/cva6/docs/VerifPlans/source/index.rst b/cva6/docs/VerifPlans/source/index.rst index 4ef40bc02..cca28ad84 100644 --- a/cva6/docs/VerifPlans/source/index.rst +++ b/cva6/docs/VerifPlans/source/index.rst @@ -25,4 +25,5 @@ CV32A6-step1 Design Verification Plan dvplan_intro dvplan_FRONTEND dvplan_ISA + dvplan_CVXIF From abc4fafcadde66607e7aca935a6bd86d561ef8ae Mon Sep 17 00:00:00 2001 From: sai krishna pidugu <103561542+spidugu444@users.noreply.github.com> Date: Sun, 5 Feb 2023 23:53:35 +0530 Subject: [PATCH 015/183] Added riscv-arch tests in smoke-tests.sh --- cva6/regress/smoke-tests.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cva6/regress/smoke-tests.sh b/cva6/regress/smoke-tests.sh index 1e69c8e1f..fe2770212 100644 --- a/cva6/regress/smoke-tests.sh +++ b/cva6/regress/smoke-tests.sh @@ -18,6 +18,8 @@ source ./cva6/regress/install-cva6.sh source ./cva6/regress/install-riscv-dv.sh source ./cva6/regress/install-riscv-compliance.sh source ./cva6/regress/install-riscv-tests.sh +source ./cva6/regress/install-riscv-isa-sim.sh +source ./cva6/regress/install-riscv-arch-test.sh if ! [ -n "$DV_SIMULATORS" ]; then DV_SIMULATORS=vcs-testharness,spike @@ -27,6 +29,8 @@ cd cva6/sim/ python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv64a6_imafdc_sv39-v.yaml --test rv64ui-v-add --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv64a6_imafdc_sv39-p.yaml --test rv64ui-p-add --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --testlist=../tests/testlist_riscv-compliance-cv64a6_imafdc_sv39.yaml --test rv32i-I-ADD-01 --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS +python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml --test rv64i_m-add-01 --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-isa-sim/arch_test_target/spike/link.ld +python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv32a60x.yaml --test rv32im-cadd-01 --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-isa-sim/arch_test_target/spike/link.ld python3 cva6.py --testlist=../tests/testlist_custom.yaml --test custom_test_template --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --c_tests ../tests/custom/hello_world/hello_world.c\ --gcc_opts "-g ../tests/custom/common/syscalls.c ../tests/custom/common/crt.S -I../tests/custom/env -I../tests/custom/common -T ../tests/custom/common/test.ld" From dd4cd4e7c28fd608713af32ffa983c08e5cd4c8a Mon Sep 17 00:00:00 2001 From: sai krishna pidugu <103561542+spidugu444@users.noreply.github.com> Date: Sun, 5 Feb 2023 23:54:49 +0530 Subject: [PATCH 016/183] Updated riscv-isa-sim.patch in install-riscv-sim.sh --- cva6/regress/install-riscv-isa-sim.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cva6/regress/install-riscv-isa-sim.sh b/cva6/regress/install-riscv-isa-sim.sh index a8fd15007..795dce32b 100644 --- a/cva6/regress/install-riscv-isa-sim.sh +++ b/cva6/regress/install-riscv-isa-sim.sh @@ -11,14 +11,19 @@ if ! [ -n "$RISCV_ISA_SIM" ]; then RISCV_ISA_SIM="https://github.com/riscv-software-src/riscv-isa-sim.git" RISCV_ISA_SIM_BRANCH="master" RISCV_ISA_SIM_HASH="b9fc8e4e9087a6064dfcc627efabbe3fd4bdc309" + RISCV_ISA_SIM_PATCH="../../../cva6/regress/riscv-isa-sim.patch" fi echo $RISCV_ISA_SIM echo $RISCV_ISA_SIM_BRANCH echo $RISCV_ISA_SIM_HASH +echo $RISCV_ISA_SIM_PATCH if ! [ -d cva6/tests/riscv-isa-sim ]; then git clone $RISCV_ISA_SIM -b $RISCV_ISA_SIM_BRANCH cva6/tests/riscv-isa-sim cd cva6/tests/riscv-isa-sim; git checkout $RISCV_ISA_SIM_HASH; + if [ -f "$RISCV_ISA_SIM_PATCH" ]; then + git apply $RISCV_ISA_SIM_PATCH + fi cd - fi From 19013024974ada92972160cc85b6c330aa85c9db Mon Sep 17 00:00:00 2001 From: sai krishna pidugu <103561542+spidugu444@users.noreply.github.com> Date: Sun, 5 Feb 2023 23:55:58 +0530 Subject: [PATCH 017/183] Added riscv-isa-sim.patch file used to control riscv-arch-test simulation --- cva6/regress/riscv-isa-sim.patch | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 cva6/regress/riscv-isa-sim.patch diff --git a/cva6/regress/riscv-isa-sim.patch b/cva6/regress/riscv-isa-sim.patch new file mode 100644 index 000000000..26cc20c6b --- /dev/null +++ b/cva6/regress/riscv-isa-sim.patch @@ -0,0 +1,15 @@ +diff --git a/arch_test_target/spike/model_test.h b/arch_test_target/spike/model_test.h +index e968e43a..7628af51 100644 +--- a/arch_test_target/spike/model_test.h ++++ b/arch_test_target/spike/model_test.h +@@ -23,6 +23,7 @@ + li x1, 1; \ + write_tohost: \ + sw x1, tohost, t1; \ ++ ecall + self_loop: j self_loop; + + #define RVMODEL_BOOT +-- +2.39.0 + From 8473f7f52906cb9144fa0ef66a3aeb5827b6f4cd Mon Sep 17 00:00:00 2001 From: sai krishna pidugu <103561542+spidugu444@users.noreply.github.com> Date: Sun, 5 Feb 2023 23:57:08 +0530 Subject: [PATCH 018/183] Added testlist file for riscv-arch-test suite --- ...st_riscv-arch-test-cv64a6_imafdc_sv39.yaml | 1022 +++++++++-------- 1 file changed, 531 insertions(+), 491 deletions(-) diff --git a/cva6/tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml b/cva6/tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml index 38d8b06ae..f2dc87e8c 100644 --- a/cva6/tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml +++ b/cva6/tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml @@ -32,705 +32,745 @@ #- import: /target/rv64imc/testlist.yaml -- test: rv64im-add-01 +##I +- test: rv64i_m-add-01 iterations: 1 path_var: TESTS_PATH - path_root: ROOT_PROJECT gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/add-01.S -- test: rv64im-addi-01 +- test: rv64i_m-addi-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/addi-01.S -- test: rv64im-addiw-01 +- test: rv64i_m-addiw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/addiw-01.S -- test: rv64im-addw-01 +- test: rv64i_m-addw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/addw-01.S -- test: rv64im-addw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/addw-01.S - -- test: rv64im-and-01 +- test: rv64i_m-and-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/and-01.S -- test: rv64im-andi-01 +- test: rv64i_m-andi-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/andi-01.S -- test: rv64im-auipc-01 +- test: rv64i_m-auipc-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/auipc-01.S -- test: rv64im-beq-01 +- test: rv64i_m-beq-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/beq-01.S -- test: rv64im-bge-01 +- test: rv64i_m-bge-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/bge-01.S -- test: rv64im-bgeu-01 +- test: rv64i_m-bgeu-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/bgeu-01.S -- test: rv64im-blt-01 +- test: rv64i_m-blt-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/blt-01.S -- test: rv64im-bltu-01 - iterations: 0 +- test: rv64i_m-bltu-01 + iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/bltu-01.S -- test: rv64im-bne-01 +- test: rv64i_m-bne-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/bne-01.S -- test: rv64im-fence-01 +- test: rv64i_m-fence-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/fence-01.S -- test: rv64im-jal-01 +- test: rv64i_m-jal-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/jal-01.S -- test: rv64im-jalr-01 +- test: rv64i_m-jalr-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/jalr-01.S -- test: rv64im-lb-align-01 +- test: rv64i_m-lb-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lb-align-01.S -- test: rv64im-lbu-align-01 +- test: rv64i_m-lbu-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lbu-align-01.S -- test: rv64im-ld-align-01 +- test: rv64i_m-ld-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/ld-align-01.S -- test: rv64im-lh-align-01 +- test: rv64i_m-lh-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lh-align-01.S -- test: rv64im-lhu-align-01 +- test: rv64i_m-lhu-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lhu-align-01.S -- test: rv64im-lui-01 +- test: rv64i_m-lui iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lui-01.S -- test: rv64im-lw-align-01 +- test: rv64i_m-lw-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lw-align-01.S -- test: rv64im-lwu-align-01 +- test: rv64i_m-lb-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lwu-align-01.S + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/lb-align-01.S -- test: rv64im-or-01 +- test: rv64i_m-or iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/or-01.S - -- test: rv64im-ori-01 + +- test: rv64i_m-ori iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/ori-01.S - -- test: rv64im-sb-align-01 + +- test: rv64i_m-sb-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sb-align-01.S - -- test: rv64im-sd-align-01 + +- test: rv64i_m-sd-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sd-align-01.S - -- test: rv64im-sh-align-01 + +- test: rv64i_m-sh-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sh-align-01.S - -- test: rv64im-sll-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sll-01.S - -- test: rv64im-slli-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slli-01.S - -- test: rv64im-slliw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slliw-01.S - -- test: rv64im-sllw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sllw-01.S - -- test: rv64im-slt-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slt-01.S - -- test: rv64im-slti-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slti-01.S - -- test: rv64im-sltiu-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sltiu-01.S - -- test: rv64im-sltu-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sltu-01.S - -- test: rv64im-sra-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sra-01.S - -- test: rv64im-srai-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srai-01.S - -- test: rv64im-sraiw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sraiw-01.S - -- test: rv64im-sraw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sraw-01.S - -- test: rv64im-srl-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srl-01.S - -- test: rv64im-srli-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srli-01.S - -- test: rv64im-srliw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srliw-01.S - -- test: rv64im-srlw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srlw-01.S - -- test: rv64im-sub-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sub-01.S - -- test: rv64im-subw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/subw-01.S - -- test: rv64im-sw-align-01 + +- test: rv64i_m-sw-align01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sw-align-01.S - -- test: rv64im-xor-01 + +- test: rv64i_m-sll + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sll-01.S + +- test: rv64i_m-slli + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slli-01.S + +- test: rv64i_m-slliw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slliw-01.S + +- test: rv64i_m-sllw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sllw-01.S + +- test: rv64i_m-slt + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slt-01.S + +- test: rv64i_m-slti + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/slti-01.S + +- test: rv64i_m-sltiu + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sltiu-01.S + +- test: rv64i_m-sltu + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sltu-01.S + +- test: rv64i_m-sra + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sra-01.S + +- test: rv64i_m-srai + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srai-01.S + +- test: rv64i_m-sraiw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sraiw-01.S + +- test: rv64i_m-sraw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sraw-01.S + +- test: rv64i_m-srl + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srl-01.S + +- test: rv64i_m-srli + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srli-01.S + +- test: rv64i_m-srliw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srliw-01.S + +- test: rv64i_m-srlw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/srlw-01.S + +- test: rv64i_m-sub + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/sub-01.S + +- test: rv64i_m-subw + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/subw-01.S + +- test: rv64i_m-xor iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/xor-01.S - -- test: rv64im-xori-01 + +- test: rv64i_m-xori iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/I/src/xori-01.S -- test: rv64im-cadd-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cadd-01.S - -- test: rv64im-caddi4spn-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddi4spn-01.S - -- test: rv64im-caddi16sp-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddi16sp-01.S - -- test: rv64im-caddi-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddi-01.S - -- test: rv64im-caddiw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddiw-01.S - -- test: rv64im-caddw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddw-01.S - -- test: rv64im-cand-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cand-01.S - -- test: rv64im-candi-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/candi-01.S - -- test: rv64im-cbeqz-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cbeqz-01.S - -- test: rv64im-cbnez-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cbnez-01.S - -- test: rv64im-cebreak-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cebreak-01.S - -- test: rv64im-cj-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cj-01.S - -- test: rv64im-cjalr-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cjalr-01.S - -- test: rv64im-cjr-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cjr-01.S - -- test: rv64im-cld-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cld-01.S - -- test: rv64im-cldsp-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cldsp-01.S - -- test: rv64im-cli-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cli-01.S - -- test: rv64im-clui-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/clui-01.S - -- test: rv64im-clw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/clw-01.S - -- test: rv64im-clwsp-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/clwsp-01.S - -- test: rv64im-cmv-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cmv-01.S - -- test: rv64im-cnop-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cnop-01.S - -- test: rv64im-cor-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cor-01.S - -- test: rv64im-csd-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csd-01.S - -- test: rv64im-csdsp-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csdsp-01.S - -- test: rv64im-cslli-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cslli-01.S - -- test: rv64im-csrai-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csrai-01.S - -- test: rv64im-csrli-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csrli-01.S - -- test: rv64im-csub-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csub-01.S - -- test: rv64im-csubw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csubw-01.S - -- test: rv64im-csw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csw-01.S - -- test: rv64im-cswsp-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cswsp-01.S - -- test: rv64im-cxor-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cxor-01.S - -- test: rv64im-div-01 + #M +- test: rv64i_m-div-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/div-01.S - -- test: rv64im-divu-01 + +- test: rv64i_m-divu-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/divu-01.S - -- test: rv64im-divuw-01 + +- test: rv64i_m-divuw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/divuw-01.S - -- test: rv64im-divw-01 + +- test: rv64i_m-divw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/divw-01.S - -- test: rv64im-mul-01 + +- test: rv64i_m-mul-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/mul-01.S - -- test: rv64im-mulh-01 + +- test: rv64i_m-mulh-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/mulh-01.S - -- test: rv64im-mulhsu-01 + +- test: rv64i_m-mulhsu-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/mulhsu-01.S - -- test: rv64im-mulhu-01 + +- test: rv64i_m-mulhu-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/mulhu-01.S - -- test: rv64im-mulw-01 + +- test: rv64i_m-mulw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/mulw-01.S - -- test: rv64im-rem-01 + +- test: rv64i_m-rem-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/rem-01.S - -- test: rv64im-remu-01 + +- test: rv64i_m-remu-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/remu-01.S - -- test: rv64im-remuw-01 + +- test: rv64i_m-remuw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/remuw-01.S - -- test: rv64im-remw-01 + +- test: rv64i_m-remw-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/M/src/remw-01.S -- test: rv64im-ebreak + #C +- test: rv64i_m-cadd-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/ebreak.S - -- test: rv64im-ecall - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/ecall.S - -- test: rv64im-misalign1-jalr-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign1-jalr-01.S - -- test: rv64im-misalign2-jalr-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign2-jalr-01.S - -- test: rv64im-misalign-beq-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-beq-01.S - -- test: rv64im-misalign-bge-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-bge-01.S - -- test: rv64im-misalign-bgeu-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-bgeu-01.S - -- test: rv64im-misalign-blt-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-blt-01.S - -- test: rv64im-misalign-bltu-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-bltu-01.S - -- test: rv64im-misalign-bne-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-bne-01.S - -- test: rv64im-misalign-jal-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-jal-01.S - -- test: rv64im-misalign-ld-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-ld-01.S - -- test: rv64im-misalign-lh-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-lh-01.S - -- test: rv64im-misalign-lhu-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-lhu-01.S - -- test: rv64im-misalign-lw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-lw-01.S - -- test: rv64im-misalign-lwu-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-lwu-01.S - -- test: rv64im-misalign-sd-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-sd-01.S - -- test: rv64im-misalign-sh-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-sh-01.S - -- test: rv64im-misalign-sw-01 - iterations: 1 - path_var: TESTS_PATH - gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/misalign-sw-01.S + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cadd-01.S -- test: rv64im-Fencei +- test: rv64i_m-caddi-01 iterations: 1 path_var: TESTS_PATH gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" - asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/Zifencei/src/Fencei.S \ No newline at end of file + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddi-01.S + +- test: rv64i_m-caddi16sp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddi16sp-01.S + +- test: rv64i_m-caddi4spn-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddi4spn-01.S + +- test: rv64i_m-caddiw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddiw-01.S + +- test: rv64i_m-caddw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/caddw-01.S + +- test: rv64i_m-cand-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cand-01.S + +- test: rv64i_m-candi-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/candi-01.S + +- test: rv64i_m-cbeqz-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cbeqz-01.S + +- test: rv64i_m-cbnez-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cbnez-01.S + +- test: rv64i_m-cebreak-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cebreak-01.S + +- test: rv64i_m-cj-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cj-01.S + +- test: rv64i_m-cjalr-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cjalr-01.S + +- test: rv64i_m-cjr-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cjr-01.S + +- test: rv64i_m-cld-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cld-01.S + +- test: rv64i_m-cldsp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cldsp-01.S + +- test: rv64i_m-cli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cli-01.S + +- test: rv64i_m-clui-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/clui-01.S + +- test: rv64i_m-clw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/clw-01.S + +- test: rv64i_m-clwsp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/clwsp-01.S + +- test: rv64i_m-cmv-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cmv-01.S + +- test: rv64i_m-cnop-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cnop-01.S + +- test: rv64i_m-cor-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cor-01.S + +- test: rv64i_m-csd-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csd-01.S + +- test: rv64i_m-csdsp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csdsp-01.S + +- test: rv64i_m-cslli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cslli-01.S + +- test: rv64i_m-csrai-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csrai-01.S + +- test: rv64i_m-csrli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csrli-01.S + +- test: rv64i_m-csub-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csub-01.S + +- test: rv64i_m-csubw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csubw-01.S + +- test: rv64i_m-csw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/csw-01.S + +- test: rv64i_m-cswsp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cswsp-01.S + +- test: rv64i_m-cxor-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/C/src/cxor-01.S + +#D +- test: rv64i_m-fcvt.d.l_b25-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.d.l_b25-01.S + +- test: rv64i_m-fcvt.d.l_b26-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.d.l_b26-01.S + +- test: rv64i_m-fcvt.d.lu_b25-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.d.lu_b25-01.S + +- test: rv64i_m-fcvt.d.lu_b26-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.d.lu_b26-01.S + +- test: rv64i_m-fcvt.l.d_b1-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b1-01.S + +- test: rv64i_m-fcvt.l.d_b22-01.S + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b22-01.S + +- test: rv64i_m-fcvt.l.d_b23-01.S + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b23-01.S + +- test: rv64i_m-fcvt.l.d_b24-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b24-01.S + +- test: rv64i_m-fcvt.l.d_b27-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b27-01.S + +- test: rv64i_m-fcvt.l.d_b28-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b28-01.S + +- test: rv64i_m-fcvt.l.d_b29-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.l.d_b29-01.S + +- test: rv64i_m-fcvt.lu.d_b1-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b1-01.S + +- test: rv64i_m-fcvt.lu.d_b22-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b22-01.S + +- test: rv64i_m-fcvt.lu.d_b23-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b23-01.S + +- test: rv64i_m-fcvt.lu.d_b24-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b24-01.S + +- test: rv64i_m-fcvt.lu.d_b27-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b27-01.S + +- test: rv64i_m-fcvt.lu.d_b28-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b28-01.S + +- test: rv64i_m-fcvt.lu.d_b29-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fcvt.lu.d_b29-01.S + +- test: rv64i_m-fmv.d.x_b25-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.d.x_b25-01.S + +- test: rv64i_m-fmv.d.x_b26-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.d.x_b26-01.S + +- test: rv64i_m-fmv.x.d_b1-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b1-01.S + +- test: rv64i_m-fmv.x.d_b22-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b22-01.S + +- test: rv64i_m-fmv.x.d_b23-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b23-01.S + +- test: rv64i_m-fmv.x.d_b24-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b24-01.S + +- test: rv64i_m-fmv.x.d_b27-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b27-01.S + +- test: rv64i_m-fmv.x.d_b28-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b28-01.S + +- test: rv64i_m-fmv.x.d_b29-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=64 -DFLEN=64 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv64i_m/D/src/fmv.x.d_b29-01.S + From 5ae8ba8ed19f5ea9cbad480cddd6e6f4d25b746e Mon Sep 17 00:00:00 2001 From: sai krishna pidugu <103561542+spidugu444@users.noreply.github.com> Date: Sun, 5 Feb 2023 23:57:58 +0530 Subject: [PATCH 019/183] Added testlist file for riscv-arch-test suite --- .../testlist_riscv-arch-test-cv32a60x.yaml | 472 ++++++++++++++++++ 1 file changed, 472 insertions(+) create mode 100644 cva6/tests/testlist_riscv-arch-test-cv32a60x.yaml diff --git a/cva6/tests/testlist_riscv-arch-test-cv32a60x.yaml b/cva6/tests/testlist_riscv-arch-test-cv32a60x.yaml new file mode 100644 index 000000000..cc6801383 --- /dev/null +++ b/cva6/tests/testlist_riscv-arch-test-cv32a60x.yaml @@ -0,0 +1,472 @@ +# Copyright Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ================================================================================ +# Regression test list format +# -------------------------------------------------------------------------------- +# test : Assembly test name +# description : Description of this test +# gen_opts : Instruction generator options +# iterations : Number of iterations of this test +# no_iss : Enable/disable ISS simulator (Optional) +# gen_test : Test name used by the instruction generator +# asm_tests : Path to directed, hand-coded assembly test file or directory +# rtl_test : RTL simulation test name +# cmp_opts : Compile options passed to the instruction generator +# sim_opts : Simulation options passed to the instruction generator +# no_post_compare : Enable/disable comparison of trace log and ISS log (Optional) +# compare_opts : Options for the RTL & ISS trace comparison +# gcc_opts : gcc compile options +# -------------------------------------------------------------------------------- +## C +- test: rv32im-cadd-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cadd-01.S + +- test: rv32im-caddi-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/caddi-01.S + +- test: rv32im-caddi16sp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/caddi16sp-01.S + +- test: rv32im-caddi4spn-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/caddi4spn-01.S + +- test: rv32im-cand-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cand-01.S + +- test: rv32im-candi-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/candi-01.S + +- test: rv32im-cbeqz-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cbeqz-01.S + +- test: rv32im-cbnez-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cbnez-01.S + +- test: rv32im-cebreak-01 + iterations: 0 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cebreak-01.S + +- test: rv32im-cj-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cj-01.S + +- test: rv32im-cjal-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cjal-01.S + +- test: rv32im-cjalr-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cjalr-01.S + +- test: rv32im-cjr-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cjr-01.S + +- test: rv32im-cli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cli-01.S + +- test: rv32im-clui-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/clui-01.S + +- test: rv32im-clw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/clw-01.S + +- test: rv32im-clwsp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/clwsp-01.S + +- test: rv32im-cmv-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cmv-01.S + +- test: rv32im-cnop-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cnop-01.S + +- test: rv32im-cor-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cor-01.S + +- test: rv32im-cslli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cslli-01.S + +- test: rv32im-csrai-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/csrai-01.S + +- test: rv32im-csrli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/csrli-01.S + +- test: rv32im-csub-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/csub-01.S + +- test: rv32im-csw-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/csw-01.S + +- test: rv32im-cswsp-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cswsp-01.S + +- test: rv32im-cxor-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/C/src/cxor-01.S + + # I +- test: rv32im-add-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/add-01.S + +- test: rv32im-addi-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/addi-01.S + +- test: rv32im-and-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/and-01.S + +- test: rv32im-andi-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/andi-01.S + +- test: rv32im-auipc-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/auipc-01.S + +- test: rv32im-beq-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/beq-01.S + +- test: rv32im-bge-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/bge-01.S + +- test: rv32im-bgeu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/bgeu-01.S + +- test: rv32im-blt-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/blt-01.S + +- test: rv32im-bltu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/bltu-01.S + +- test: rv32im-bne-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/bne-01.S + +- test: rv32im-fence-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/fence-01.S + +- test: rv32im-jal-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/jal-01.S + +- test: rv32im-jalr-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/jalr-01.S + +- test: rv32im-lb-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/lb-align-01.S + +- test: rv32im-lbu-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/lbu-align-01.S + +- test: rv32im-lh-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/lh-align-01.S + +- test: rv32im-lhu-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/lhu-align-01.S + +- test: rv32im-lui-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/lui-01.S + +- test: rv32im-lw-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/lw-align-01.S + +- test: rv32im-or-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/or-01.S + +- test: rv32im-ori-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/ori-01.S + +- test: rv32im-sb-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sb-align-01.S + +- test: rv32im-sh-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sh-align-01.S + +- test: rv32im-sll-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sll-01.S + +- test: rv32im-slli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/slli-01.S + +- test: rv32im-slt-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/slt-01.S + +- test: rv32im-slti-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/slti-01.S + +- test: rv32im-sltiu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sltiu-01.S + +- test: rv32im-sltu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sltu-01.S + +- test: rv32im-sra-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sra-01.S + +- test: rv32im-srai-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/srai-01.S + +- test: rv32im-srl-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/srl-01.S + +- test: rv32im-srli-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/srli-01.S + +- test: rv32im-sub-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sub-01.S + +- test: rv32im-sw-align-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/sw-align-01.S + +- test: rv32im-xor-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/xor-01.S + +- test: rv32im-xori-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/I/src/xori-01.S + + # M +- test: rv32im-div-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/div-01.S + +- test: rv32im-divu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/divu-01.S + +- test: rv32im-mul-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/mul-01.S + +- test: rv32im-mulh-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/mulh-01.S + +- test: rv32im-mulhsu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/mulhsu-01.S + +- test: rv32im-mulhu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/mulhu-01.S + +- test: rv32im-rem-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/rem-01.S + +- test: rv32im-remu-01 + iterations: 1 + path_var: TESTS_PATH + gcc_opts: "-DXLEN=32 -DTEST_CASE_1=True -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -I/riscv-arch-test/riscv-test-suite/env/ -I/riscv-isa-sim/arch_test_target/spike/" + asm_tests: /riscv-arch-test/riscv-test-suite/rv32i_m/M/src/remu-01.S + From 32e525662eac519ead6aa81c5928e565c59d889d Mon Sep 17 00:00:00 2001 From: JeanRochCoulon Date: Mon, 6 Feb 2023 08:35:31 +0100 Subject: [PATCH 020/183] Gather the 32 bit tests together --- cva6/regress/smoke-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cva6/regress/smoke-tests.sh b/cva6/regress/smoke-tests.sh index fe2770212..78dfd8677 100644 --- a/cva6/regress/smoke-tests.sh +++ b/cva6/regress/smoke-tests.sh @@ -30,7 +30,6 @@ python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv64a6_imafdc_sv39-v.ya python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv64a6_imafdc_sv39-p.yaml --test rv64ui-p-add --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --testlist=../tests/testlist_riscv-compliance-cv64a6_imafdc_sv39.yaml --test rv32i-I-ADD-01 --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml --test rv64i_m-add-01 --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-isa-sim/arch_test_target/spike/link.ld -python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv32a60x.yaml --test rv32im-cadd-01 --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-isa-sim/arch_test_target/spike/link.ld python3 cva6.py --testlist=../tests/testlist_custom.yaml --test custom_test_template --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --target cv64a6_imafdc_sv39 --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml --c_tests ../tests/custom/hello_world/hello_world.c\ --gcc_opts "-g ../tests/custom/common/syscalls.c ../tests/custom/common/crt.S -I../tests/custom/env -I../tests/custom/common -T ../tests/custom/common/test.ld" @@ -38,6 +37,7 @@ make -C ../../core-v-cores/cva6 clean make clean_all python3 cva6.py --testlist=../tests/testlist_riscv-compliance-cv32a60x.yaml --test rv32i-I-ADD-01 --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS $DV_OPTS python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv32a60x-p.yaml --test rv32ui-p-add --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS $DV_OPTS +python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv32a60x.yaml --test rv32im-cadd-01 --iss_yaml cva6.yaml --target cv32a60x --iss=$DV_SIMULATORS $DV_OPTS --linker=../tests/riscv-isa-sim/arch_test_target/spike/link.ld make -C ../../core-v-cores/cva6 clean make clean_all From 0b317e17043b4301a9ef377ccc3e7aa7d71e432e Mon Sep 17 00:00:00 2001 From: sai krishna pidugu <103561542+spidugu444@users.noreply.github.com> Date: Mon, 6 Feb 2023 17:27:30 +0530 Subject: [PATCH 021/183] Updated cva6.yml by adding pub_riscv-arch-test task --- .gitlab-ci/cva6.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.gitlab-ci/cva6.yml b/.gitlab-ci/cva6.yml index b9442f7d2..5dbfcd100 100644 --- a/.gitlab-ci/cva6.yml +++ b/.gitlab-ci/cva6.yml @@ -158,6 +158,33 @@ pub_smoke: paths: - artifacts/reports/*.yml +pub_riscv_arch_test: + stage: two + extends: + - .template_job_short_ci + needs: + - job: pub_smoke + artifacts: false + parallel: + matrix: + - DV_TARGET: [cv64a6_imafdc_sv39, cv32a60x] + variables: + DV_SIMULATORS: "veri-testharness,spike" + DASHBOARD_JOB_TITLE: "arch_test $DV_TARGET" + DASHBOARD_JOB_DESCRIPTION: "Compliance regression suite" + DASHBOARD_SORT_INDEX: 0 + DASHBOARD_JOB_CATEGORY: "Test suites" + script: + - mkdir -p artifacts/reports + - python3 .gitlab-ci/scripts/report_fail.py + - echo $SYN_VCS_BASHRC; source $SYN_VCS_BASHRC + - source cva6/regress/dv-riscv-arch-test.sh + - python3 .gitlab-ci/scripts/report_simu.py cva6/sim/logfile.log + artifacts: + when: always + paths: + - "artifacts/reports/*.yml" + pub_hwconfig: stage: two extends: From 73a2d30243f0ac796cedebdbf2297aa75d5d05af Mon Sep 17 00:00:00 2001 From: Rana Adeel Ahmad Date: Mon, 6 Feb 2023 18:02:50 +0500 Subject: [PATCH 022/183] Documentation for the UVM_Verification Environment for CVA6 core. --- cva6/docs/UVM_verif_env.md | 2 +- cva6/docs/images/CVA6_UVM_env.drawio.png | Bin 37342 -> 0 bytes cva6/docs/images/CVA6_env.drawio.drawio.png | Bin 0 -> 154591 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 cva6/docs/images/CVA6_UVM_env.drawio.png create mode 100644 cva6/docs/images/CVA6_env.drawio.drawio.png diff --git a/cva6/docs/UVM_verif_env.md b/cva6/docs/UVM_verif_env.md index ccd58d9c3..cbd638e45 100644 --- a/cva6/docs/UVM_verif_env.md +++ b/cva6/docs/UVM_verif_env.md @@ -6,7 +6,7 @@ This document describes the uvm verification environment of the CVA6 core. This environment is intended to be able to verify the CVA6 core and run different test cases by the minimal modification to the environment itself. The environment is shown below: -![alt_text](images/CVA6_UVM_env.drawio.png "image_tooltip") +![alt_text](images/CVA6_env.drawio.drawio.png "image_tooltip") *** diff --git a/cva6/docs/images/CVA6_UVM_env.drawio.png b/cva6/docs/images/CVA6_UVM_env.drawio.png deleted file mode 100644 index 151107b7a83a6f7256bd8390c77d50d6c70dd071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37342 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 diff --git a/cva6/docs/images/CVA6_env.drawio.drawio.png b/cva6/docs/images/CVA6_env.drawio.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..1c46c0c8f7f75f20cbcb6f4acba36d28bd8fdbb4 GIT binary patch literal 154591 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%0DJ!@O2GB{uB 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 literal 0 HcmV?d00001 From 79100f4c8c432f902bf26acb8fa7fbbfa04bb1a5 Mon Sep 17 00:00:00 2001 From: Rana Adeel Ahmad Date: Tue, 7 Feb 2023 18:08:57 +0500 Subject: [PATCH 023/183] Documentation for the UVM_Verification Environment for CVA6 core. --- cva6/docs/images/CVA6_env.drawio.drawio.png | Bin 154591 -> 156885 bytes .../uvma_cvxif/src/comps/uvma_cvxif_mon.sv | 2 ++ 2 files changed, 2 insertions(+) diff --git a/cva6/docs/images/CVA6_env.drawio.drawio.png b/cva6/docs/images/CVA6_env.drawio.drawio.png index 1c46c0c8f7f75f20cbcb6f4acba36d28bd8fdbb4..b7cb35952c99b4e7b23dce2c698c224b2e9806e7 100644 GIT binary patch literal 156885 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

XP(tCL)`Teq&j z9mHuPA=7{NuU4UM0*Tk5ZC!9`-?5hayd%& z_h-Z_s^U{9osEa|m$4ax>;B3fld9$b{nZ%eiH^8FLc~N^qNT1I!^vBChmk_V)+0|sLywS(N<1<_)sdO45t@L<&~Ao#*1FqrPB3x1O7I9~7zE0k@~-uK5j2N|a!af$t?htj?W2$E3_U zUDbKl)0{?s>kERVNBn1`L2vve?WguI1q_SN@$Hg~krSt-<7XxF7saXPV^8{HmW@|#XE(vvi*CFN< zQRlS~@lkAk;MawcwYBNVvZyRS#5iP|qeW)xQj`WJ(43VWEk1DpeG$IqE#O&<#k$=W zf%1?*Lu$;iWfq<{-a>tH2Xu!_d@8z~hp;yG)|mbkf~2ntX)V-V2T{5?uT54M`ie0V z(F^H*@2_=ql}y50n%(}xs-z&^yY%W85?RLVTV}bL06z^rN|(sqPwQUBv|ii&=_s>{ zw3RL|jqaHE3IAM;7S$uTN=M}V*ng6D3~svNL%!)L(RxTqZ!Er1_OKYg9jz%b zeXLm0hnKLdE!YS5CWdU>&0|@7tC>8Li2IH~rz_nO$^#c`nYt1pMltZL86{`9%6lO(#*-18Ba^TcbTA|o~1J2ssOjEEeTmioI; z=&k^DT)`%*5X-#UnjYFx%o7U;Jd)TA z?xkL;gytj!WO5=FVrG`-Rzl#z}Mju$NnHu;|RI z3P?nyB2;`>ozY^#@C%TxaDTR6VB=9%bLribdZCF2aiYFfn5-F-S(eHsSG1kbB`Rsw z*|F;2`2enx>v>|c`~g|q@b-#(C2_XD$}86Cyd*OuhSItg?iCm0xnGo27h-Jf>PD%L z4Jh2%c8d59!uBDN@A*HJAHtj(11!K-ZKfN4Pi-vj{QT6>PQtpAH(QK=PX3;0xH{JC zr7K~{n#k;A+0>WeZ%KEM9EPG>CrVP#aZ<_4YBk35IDbR`o;XLqs0c_Fg(5Qd-^F&BKK_XFUlm zAPv;*ZSnc*;oZHmJkoZJ?ZnNNFrGov=f#*GH!M;bWW`s<*VA<0X220oxbDQ3m|tlN zo>r5cF zF{cn@bfr1uO4ytEhM=!$l;(;=ZQIf}l>7GvCeF&74hAj8+HStJrPW0kd}+ttDK)aM&Q7wue~N_w@yxC>qOe8pRxsS;rT zQS)OORFDY&Urf@qpBE}2Gbqp?8Y|nuaufVNa`6Aa5LVR1*;_C33NC%i%50D=oqy3_ zwQJ=%9Cs9pz_iNPW>4oE(ajv3^V%g1hlBqJDYv?^Jq2iiFZKV)z3AGyx0)7H6d|-{ zQYbb5M)@Ync{T}jzh0S%yGznEZ*KZ|lPK`)_aLWZ9Lm$tyNBSMWuWMiLoivad*B@X zbiFKB-k+YD;@|x6-)r?r)VYd!?r?Oy9C6PN?7nh38TO&QDCNH;g%I}m4zSds4)spq z&P<`Ba`B(MSYL<{BpqJd^b4=3lavo~QF12iv@f;mT6V9dOo00vEPcz6rHy)U?uipq zTGF2%94@p=dI;1Gy}|8^-9s zM4ydnvTO%>fC;z9o=D#8ZGOA_#4}}gLsujbii9SMz)9=QLDw{&QzYYQr#>kkdT-?A z;M6mwS|Mo&H;w_20DXGTcoeVR*ensYN4A>*h$v~~w6K=L<~Vy-PP^S}+y zcpQCTZAa0M_01Sr!MSM8%1b;EXrK(!fmDURex%2=rM~FJc_g#v02CDzE&AZZwgbJ# z_KWPL>f!?>x70B>Tzb*u#vO6J;

#d6d&=a=PXh8?}(GAV!uhO()0mP4ihM&1FQ# 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%0DJ!@O2GB{uB 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 diff --git a/lib/uvm_agents/uvma_cvxif/src/comps/uvma_cvxif_mon.sv b/lib/uvm_agents/uvma_cvxif/src/comps/uvma_cvxif_mon.sv index 5e9d0ebe3..f950dd86f 100644 --- a/lib/uvm_agents/uvma_cvxif/src/comps/uvma_cvxif_mon.sv +++ b/lib/uvm_agents/uvma_cvxif/src/comps/uvma_cvxif_mon.sv @@ -1,3 +1,5 @@ + + // Copyright 2021 Thales DIS design services SAS // // Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); From 0243117f2395c9999aaf942ae8b6d5a2a077dca4 Mon Sep 17 00:00:00 2001 From: JeanRochCoulon Date: Thu, 9 Feb 2023 17:48:13 +0100 Subject: [PATCH 024/183] Fix typo related to TESTS_REPO --- .gitlab-ci/setup-ci-example/core-v-verif-cv32.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci/setup-ci-example/core-v-verif-cv32.yml b/.gitlab-ci/setup-ci-example/core-v-verif-cv32.yml index 30538e931..a43b7c60b 100644 --- a/.gitlab-ci/setup-ci-example/core-v-verif-cv32.yml +++ b/.gitlab-ci/setup-ci-example/core-v-verif-cv32.yml @@ -15,8 +15,8 @@ variables: COMPLIANCE_HASH: 220e78542da4510e40eac31e31fdd4e77cdae437 COMPLIANCE_PATCH: ../../../cva6/riscv-compliance.patch TESTS_REPO: https://github.com/riscv/riscv-tests.git - TEST_BRANCH: master - TEST_HASH: f92842f91644092960ac7946a61ec2895e543cec + TESTS_BRANCH: master + TESTS_HASH: f92842f91644092960ac7946a61ec2895e543cec DV_REPO: https://github.com/google/riscv-dv.git DV_BRANCH: master NUM_JOBS: 24 From f454ea40b05cad91aa9342c2cf439802282d911e Mon Sep 17 00:00:00 2001 From: JeanRochCoulon Date: Thu, 9 Feb 2023 17:48:56 +0100 Subject: [PATCH 025/183] fix typo related to TESTS_REPO --- .gitlab-ci/setup-ci-example/core-v-verif-cva6.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci/setup-ci-example/core-v-verif-cva6.yml b/.gitlab-ci/setup-ci-example/core-v-verif-cva6.yml index ab5d5f98e..a0553c582 100644 --- a/.gitlab-ci/setup-ci-example/core-v-verif-cva6.yml +++ b/.gitlab-ci/setup-ci-example/core-v-verif-cva6.yml @@ -16,8 +16,8 @@ variables: COMPLIANCE_HASH: 220e78542da4510e40eac31e31fdd4e77cdae437 COMPLIANCE_PATCH: ../../../cva6/riscv-compliance.patch TESTS_REPO: https://github.com/riscv/riscv-tests.git - TEST_BRANCH: master - TEST_HASH: f92842f91644092960ac7946a61ec2895e543cec + TESTS_BRANCH: master + TESTS_HASH: f92842f91644092960ac7946a61ec2895e543cec DV_REPO: https://github.com/google/riscv-dv.git DV_BRANCH: master NUM_JOBS: 24 From 0e16c6a0e201e1a491f092c510cf348ad728454a Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 6 Feb 2023 16:02:04 +0100 Subject: [PATCH 026/183] [VPTOOL] Use Ruamel Yaml to handle Yaml I/O. Set up infra for Yaml output. * tools/vptool/vptool/vp.py (toplevel): Import Ruamel Yaml instead of the PyYaml flavor. Add skeleton of support for *existing* DVplan object classes. (MyMain.save_db): Update the Git SHA1 signatures on all IPs, not only on those currently unlocked (all IPs are manipulated by the current VPTOOL version, whether saved or not.) Update Pickle protocol version to v4 (default in Python 3.6+). Add stubs/comments for Yaml output. (MyMain.load_db_quiet): Add stubs/comments for Yaml input. (MyMain.lock_ip): Use Pickle protocol v4. (MyMain.lock_all_ip): Ditto. (MyMain.save_personalization): Ditto. (toplevel): Use Ruamel Yaml engine to load configuration file using the safe loader. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 71 ++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index a782de3ee..a4a1e7098 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -20,18 +20,25 @@ from inspect import ismethod import pickle from collections import OrderedDict +# Use Ruamel YAML support +from ruamel.yaml import YAML, yaml_object +# global db_yaml_engine +# db_yaml_engine = YAML(typ='rt') + # import cPickle as pickle # Configuration (env + Python + Yaml) is imported indirectly via vp_pack. from vp_pack import * + +# db_yaml_engine.register_class(Item) +# db_yaml_engine.register_class(Prop) +# db_yaml_engine.register_class(Ip) + import os, sys, pwd, glob, subprocess from optparse import OptionParser, Option from PIL import Image, ImageTk import shutil import hashlib -# PyYAML import: Use C backend (libyaml) if available. -from yaml import load, dump - try: from yaml import CLoader as Loader, CDumper as Dumper except ImportError: @@ -1953,16 +1960,16 @@ class MyMain: save_dir = os.path.dirname(vp_config.SAVED_DB_LOCATION) saved_ip_str = "" for ip_elt in pickle_ip_list: + # Sign the IP with the current SHA1 of VPTOOL. + ip_elt[1].vptool_gitrev = self.vptool_gitrev + ip_elt[1].io_fmt_gitrev = vp_config.io_fmt_gitrev + ip_elt[1].config_gitrev = vp_config.config_gitrev + ip_elt[1].ymlcfg_gitrev = vp_config.yaml_config[ + "yaml_cfg_gitrev" + ] # Save individual IPs only if locked by user. if self.is_locked_by_user(current_ip_name=ip_elt[1].name): saved_ip_str += "\n " + ip_elt[1].name - # Sign the IP with the current SHA1 of VPTOOL. - ip_elt[1].vptool_gitrev = self.vptool_gitrev - ip_elt[1].io_fmt_gitrev = vp_config.io_fmt_gitrev - ip_elt[1].config_gitrev = vp_config.config_gitrev - ip_elt[1].ymlcfg_gitrev = vp_config.yaml_config[ - "yaml_cfg_gitrev" - ] with open( save_dir + "/VP_IP" @@ -1970,7 +1977,21 @@ class MyMain: + ".pck", "wb", ) as output: - pickle.dump(ip_elt, output, 0) + pickle.dump(ip_elt, output, 4) + # TODO: Add translation of pickle_ip_list to new-gen + # types *HERE*, after emitting Pickle. + # Emit the Yaml output from the fixed structures, + # skipping pickled ones. + # Write yaml output + #with open( + # save_dir + # + "/VP_IP" + # + str(ip_elt[1].ip_num).zfill(3) + # + ".yml", + # "wb", + #) as output: + # db_yaml_engine.dump(ip_elt[1], output) + if saved_ip_str: tkinter.messagebox.showinfo( "Info", @@ -1987,10 +2008,11 @@ class MyMain: % vp_config.yaml_config["gui"]["ip"]["label"].lower(), ) else: + # ZC FIXME Add support for Yaml in non-split-save mode. with open(vp_config.SAVED_DB_LOCATION, "wb") as output: - pickle.dump(len(pickle_ip_list), output, 0) + pickle.dump(len(pickle_ip_list), output, 4) for ip_elt in pickle_ip_list: - pickle.dump(ip_elt, output, 0) + pickle.dump(ip_elt, output, 4) self.prep_db_import() # update_ip_widget() self.update_all_item_target_list() @@ -2058,6 +2080,9 @@ class MyMain: # print("---INFO: Loading "+filename) with open(filename, "rb") as input: pickle_ip_list.append(pickle.load(input)) + #for filename in glob.glob(dir_to_load + "/VP_IP*yml"): + # with open(filename, "rb") as input: + # pickle_ip_list.append(db_yaml_engine.load(input)) if pickle_ip_list: # Find the lowest ip_num that can be used for newly created IPs. # It has to be higher than the highest existing ip_num. @@ -2065,6 +2090,7 @@ class MyMain: ip_num_next = 1 + max( [ (lambda e: e if isinstance(e, int) else int(e, base=10))( + #elt.ip_num # Yaml !!omap mode: list of objects elt[1].ip_num ) for elt in pickle_ip_list @@ -2083,6 +2109,12 @@ class MyMain: for dummy in range(ip_num_next): pickle_ip_list.append(pickle.load(input)) # change list to dict + # Yaml mode: !!omap produced a list of elts + #for ip_elt in pickle_ip_list: + # self.ip_list[ip_elt.name] = ip_elt + # # Seems pickle doesn't restore class attribute. Done manually here for IP + # self.ip_list[ip_elt.name].__class__._ip_count = ip_num_next + # Pickle mode: list of objects is a list of mappings for ip_key, ip_elt in pickle_ip_list: self.ip_list[ip_key] = ip_elt # Seems pickle doesn't restore class attribute. Done manually here for IP @@ -2145,7 +2177,7 @@ class MyMain: LOCKED_IP_DICT[current_ip_name] = pwd.getpwuid(os.getuid()).pw_name try: with open(vp_config.LOCKED_IP_LOCATION, "wb") as output: - pickle.dump(LOCKED_IP_DICT, output, 0) + pickle.dump(LOCKED_IP_DICT, output, 4) self.update_ip_widget() except Exception as e: print( @@ -2168,7 +2200,7 @@ class MyMain: LOCKED_IP_DICT[current_ip_name] = pwd.getpwuid(os.getuid()).pw_name try: with open(vp_config.LOCKED_IP_LOCATION, "wb") as output: - pickle.dump(LOCKED_IP_DICT, output, 0) + pickle.dump(LOCKED_IP_DICT, output, 4) self.update_ip_widget() except Exception as e: print( @@ -2247,9 +2279,9 @@ class MyMain: if os.path.exists(sys.argv[0]): preference_file = os.path.dirname(sys.argv[0]) + "/" + PERSO_FILE with open(preference_file, "wb") as output: - pickle.dump(BG_COLOR, output, 0) - pickle.dump(EDITOR, output, 0) - pickle.dump(self.verif_menu.enable_image_panel.get(), output, 0) + pickle.dump(BG_COLOR, output, 4) + pickle.dump(EDITOR, output, 4) + pickle.dump(self.verif_menu.enable_image_panel.get(), output, 4) def change_gui_color(self): global BG_COLOR @@ -2455,7 +2487,8 @@ def __generate_option_parser(): # Load YAML configuration if available. try: with open(os.path.join(os.path.dirname(__file__), YAML_CONFIG_FILE), "r") as f: - vp_config.init_yaml_config(load(f, Loader=Loader)) + config_yaml_engine = YAML(typ='safe') + vp_config.init_yaml_config(config_yaml_engine.load(f)) # print("YAML config = \n" + dump(vp_config.yaml_config, Dumper=Dumper)) except Exception as e: print( From 64c0fe5b249794ef41042e1805bb27905ef24a45 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Tue, 7 Feb 2023 12:31:44 +0100 Subject: [PATCH 027/183] [VPTOOL] Add transcoding of legacy structures. Output new structs as Yaml. * tools/vptool/vptool/vp.py (db_yaml_engine): New global object. Register VerifItem, Subfeature and Feature as Yaml-supported classes. (MyMain.save_db): Dump new-style data structures as Yaml for all Ip objects. (MyMain.load_db_quiet): Update Yaml-relaed comments. * tools/vptool/vptool/vp_pack.py (toplevel): Import OrderedDict. (VerifItem): New class. (Item.to_VerifItem): Add translation method legacy->new for verif items. (Subfeature): New class. (Prop.to_Subfeature): Add translation method legacy->new for subfeatures. (Feature): New class. (Ip.to_Feature): Add translation method legacy->new for features. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 28 ++--- tools/vptool/vptool/vp_pack.py | 202 +++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+), 14 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index a4a1e7098..900ed0905 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -22,16 +22,16 @@ from collections import OrderedDict # Use Ruamel YAML support from ruamel.yaml import YAML, yaml_object -# global db_yaml_engine -# db_yaml_engine = YAML(typ='rt') +global db_yaml_engine +db_yaml_engine = YAML(typ='rt') # import cPickle as pickle # Configuration (env + Python + Yaml) is imported indirectly via vp_pack. from vp_pack import * -# db_yaml_engine.register_class(Item) -# db_yaml_engine.register_class(Prop) -# db_yaml_engine.register_class(Ip) +db_yaml_engine.register_class(VerifItem) +db_yaml_engine.register_class(Subfeature) +db_yaml_engine.register_class(Feature) import os, sys, pwd, glob, subprocess from optparse import OptionParser, Option @@ -1983,14 +1983,14 @@ class MyMain: # Emit the Yaml output from the fixed structures, # skipping pickled ones. # Write yaml output - #with open( - # save_dir - # + "/VP_IP" - # + str(ip_elt[1].ip_num).zfill(3) - # + ".yml", - # "wb", - #) as output: - # db_yaml_engine.dump(ip_elt[1], output) + with open( + save_dir + + "/VP_IP" + + str(ip_elt[1].ip_num).zfill(3) + + "_new_types.yml", + "wb", + ) as output: + db_yaml_engine.dump(ip_elt[1].to_Feature(), output) if saved_ip_str: tkinter.messagebox.showinfo( @@ -2109,7 +2109,7 @@ class MyMain: for dummy in range(ip_num_next): pickle_ip_list.append(pickle.load(input)) # change list to dict - # Yaml mode: !!omap produced a list of elts + # Yaml mode: !!omap yields a list of elts when loaded. #for ip_elt in pickle_ip_list: # self.ip_list[ip_elt.name] = ip_elt # # Seems pickle doesn't restore class attribute. Done manually here for IP diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index 2f6f9e7bc..afcf27b5e 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -10,6 +10,7 @@ import sys, os from datetime import datetime +from collections import OrderedDict import re # Load the configuration associated with the current platform @@ -47,6 +48,61 @@ def normalize_tag(l): ##################################### ##### Class Definition + +class VerifItem: + """ + A Verification Item captures a specific aspect of a design that + can be individually verified. + Verification Items are intended to be instantiated in a Subfeature + class which groups Verification Items related to a given property of + the design, e.g. to one instruction of an Instruction Set. + """ + # Class variable: Names of Python attributes of a Verification Item that + # can be free-form strings and have default cue strings defined. + attr_names = [ + "description", + "reqt_doc", # Note the 'd' in '_doc'... + "verif_goals", + "coverage_loc", + "comments" + ] + # Class variable: Matching names in Yaml-based GUI configuration + gui_fields = [ + "feature_descr", + "requirement_loc", + "verif_goals", + "coverage_loc", + "comments", + ] + + def __init__(self, name=0, tag="", description=""): + # Identifier of the Item, used in display lists. + self.name = name + # Unique tag of the Verificataion Item (never to be reused). + self.tag = tag + # Description of the property to be verified. + self.description = description + # Document containing the corresponding requirement + self.reqt_doc = "" + # Pointers into the document + self.ref_mode = "page" + self.ref_page = "" + self.ref_section = "" + self.ref_viewer = "firefox" + # Goals of verification + self.verif_goals = "" + # Pointer to coverage data + self.coverage_loc = "" + # Pass/fail criteria + self.pfc = -1 # None selected, must choose + # Test type + self.test_type = -1 # None selected, must choose + # Coverage method + self.cov_method = -1 # None selected, must choose + # Applicable cores + self.cores = -1 # By default, a new Verif Item is applicable to all cores. + self.comments = "" + class Item: """ An item defines a specific case to test depending on its parent property @@ -95,6 +151,27 @@ class Item: self.rfu_dict = {} # used as lock. will be updated with class update self.rfu_dict["lock_status"] = 0 + def to_VerifItem(self): + """ + Convert an Item to a VerifItem. Keep only the information that's needed. + """ + result = VerifItem(self.name, self.tag, self.description) + result.reqt_doc = self.purpose + # These attributes may be missing on objects coming from older VPTOOL versions. + for attr in ["ref_mode", "ref_page", "ref_section", "ref_viewer"]: + if hasattr(self, attr): + setattr(result, attr, getattr(self, attr)) + else: + setattr(result, attr, "") + result.verif_goals = self.verif_goals + result.pfc = self.pfc + result.test_type = self.test_type + result.cov_method = self.cov_method + result.cores = self.cores + result.coverage_loc = self.coverage_loc + result.comments = self.comments + return result + def attrval2str(self, attr): if attr == "cores" and "cores" in vp_config.yaml_config: # 'cores' are at toplevel of the Yaml config and the attr value is a bitmap. @@ -198,6 +275,43 @@ class Item: self.tag = normalize_tag(self.tag) +class Subfeature: + """ + A Subfeature is a subset of a major design feature that is characterized + by a distinctive property. Therefore, the verification items related to + that property are closely related and are grouped together into a list + associated with the Subfeature. + """ + def __init__(self, name="", tag=""): + # Name of the subfeature + self.name = name + # Tag of the subfeature: Must be unique across all subfeatures. + self.tag = tag + # Index of the next item to be added (MUST INCREASE ON EVERY ADDITION!) + self.next_elt_id = 0 + # List of Verification Items in this feature: an OrderedDict. + self.items = OrderedDict() + + def __str__(self): + return format("### Sub-feature: %s\n\n" % (self.name)) + + def add_item(self, tag, description=""): # adds a Verification Item to subfeature + new_item = VerifItem( + str(self.next_elt_id).zfill(3), + tag=tag + "_I" + str(self.next_elt_id).zfill(3), + description=description, + ) + self.items[str(self.next_elt_id).zfill(3)] = new_item + self.next_elt_id += 1 + # Return a ref to the newly created item. + return new_item + + def del_item(self, index): # remove a verification item from the subfeature + del self.items[index] + + def get_item_names(self): + return [item.name for item in self.items.values()] + class Prop: """ A Property defines a specific behaviour or an IP section, to be tested/verified @@ -219,6 +333,24 @@ class Prop: self.rfu_list_2 = [] self.rfu_dict = {} + def to_Subfeature(self): + """ + Convert a legacy Prop to a Subfeature, transfer only the fields that are required. + """ + result = Subfeature(self.name, self.tag) + # 'next_elt_id' needs extra care as 'item_count' assumes a contiguous + # numbering of Items in Prop and will be inconsistent if items are removed. + # Computing the max of item IDs is not reliable either in case the last + # item was removed. + result.next_elt_id = self.item_count + max_item_id = max([int(elt[1].name) for elt in (self.item_list if self.item_list else self.rfu_list)]) + if max_item_id >= self.item_count: + raise ValueError((self.item_count, max_item_id)) + result.next_elt_id = 1 + max_item_id + translated_items = [[elt[0], elt[1].to_VerifItem()] for elt in (self.item_list if self.item_list else self.rfu_list)] + result.items = OrderedDict(translated_items) + return result + def __str__(self): return format("### Sub-feature: %s\n\n" % (self.name)) @@ -315,6 +447,64 @@ class Prop: for item in list(self.item_list.values()): item.lock() +class Feature: + """ + A Feature is a major group of design properties, for example + a class of instructions or an operation mode of an interface. + """ + # Class variable: highest Feature ID seen so far. + _highest_id = -1 + + def __init__(self, name="", id=0): + # Index of next subfeature to add (MUST ALWAYS GROW upon adding subfeatures!) + self.next_elt_id = 0 + # Name of the Feature + self.name = name + # Numerical ID of the Feature: Use the highest known value PLUS ONE + # unless explicitly given (e.g., when converting Ip objects). + if id != 0: + if id > self.__class__._highest_id: + self.__class__._highest_id = id + self.id = id + else: + raise ValueError((id, self.__class__._highest_id)) + else: + self.__class__._highest_id += 1 + self.id = self.__class__._highest_id + # Index of the Feature (for display ordering) + #self.index = index + # List of subfeatures + self.subfeatures = OrderedDict() + + def __str__(self): + return format("## Feature: %s\n\n" % (self.name)) + + def add_subfeature(self, name, tag=""): + """ + Add a subfeature of the current feature. + """ + if name in self.subfeatures.keys(): + print("Subfeature '%s' already exists in Feature '%s'!" % (name, self.name)) + feedback = 0 + else: + name = remove_non_ascii(name) + subfeature_name = str(self.next_elt_id).zfill(3) + "_" + str(name) + self.next_elt_id += 1 + self.subfeatures[name] = Subfeature( + subfeature_name, + tag="VP_" + + vp_config.PROJECT_IDENT + + "_F" + + str(self.ip_num).zfill(3) + + "_S" + + str(self.prop_count).zfill(3), + ) + feedback = self.subfeatures[subfeature_name].tag + self._count += 1 + return (feedback, subfeature_name) + + def del_subfeature(self, name): + del self.subfeatures[str(name)] class Ip: """ @@ -341,6 +531,18 @@ class Ip: self.rfu_list_0 = [] self.rfu_list_1 = [] + def to_Feature(self): + """ + Convert an Ip to a Feature. + """ + result = Feature(self.name, self.ip_num) + # Next_elf_it needs extra care as it is derived from the length of the list + # of Properties / Subfeatures. + result.next_elt_id = self.prop_count + translated_subfeatures = [[elt[0], elt[1].to_Subfeature()] for elt in (self.prop_list if self.prop_list else self.rfu_list)] + result.subfeatures = OrderedDict(translated_subfeatures) + return result + def __str__(self): return format("## Feature: %s\n\n" % (self.name)) From 364fd25fd40fdfb10cc337792d65d0749612369c Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Tue, 7 Feb 2023 17:30:47 +0100 Subject: [PATCH 028/183] [VPTOOL] Save Git SHA1s in Yaml data. Add Yaml->legacy translation path. * tools/vptool/vptool/vp_pack.py (VerifItem.__init__): Reorder attribs to better match GUI layout. Update comments. (VerifItem.to_Item): New. (Item.to_VerifItem): Factorize identical attribute assignment. (Subfeature.__init__): Add 'display_order' attrib. (Subfeature.to_Prop): New. (Prop.to_Subfeature): Propagage 'wid_order' attrib as 'display_order'. (Feature.__init__): Add 'display_order' and VPTOOL Git SHA1 attribs. (Feature.to_Ip): New. (Ip.__init__): Add VPTOOL Git SHA1 attribs. (Ip.to_Feature): Copy Git SHA1 attribs. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp_pack.py | 72 ++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index afcf27b5e..d9d5324a1 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -82,17 +82,15 @@ class VerifItem: self.tag = tag # Description of the property to be verified. self.description = description - # Document containing the corresponding requirement + # Document containing the corresponding requirement or design spec. self.reqt_doc = "" - # Pointers into the document + # Viewing information for the requirement/design document. self.ref_mode = "page" self.ref_page = "" self.ref_section = "" self.ref_viewer = "firefox" # Goals of verification self.verif_goals = "" - # Pointer to coverage data - self.coverage_loc = "" # Pass/fail criteria self.pfc = -1 # None selected, must choose # Test type @@ -101,8 +99,24 @@ class VerifItem: self.cov_method = -1 # None selected, must choose # Applicable cores self.cores = -1 # By default, a new Verif Item is applicable to all cores. + # Pointer to coverage data + self.coverage_loc = "" + # User comments for the verification item self.comments = "" + def to_Item(self): + """ + Convert a VerifItem to a legacy-style Item object. + """ + result = Item(self.name, self.tag, self.description, self.reqt_doc) + # These attributes are a 1-to-1 match. + for attr in [ + "ref_mode", "ref_page", "ref_section", "ref_viewer", "verif_goals", + "pfc", "test_type", "cov_method", "cores", "coverage_loc", "comments", + ]: + setattr(result, attr, getattr(self, attr)) + return result + class Item: """ An item defines a specific case to test depending on its parent property @@ -163,13 +177,12 @@ class Item: setattr(result, attr, getattr(self, attr)) else: setattr(result, attr, "") - result.verif_goals = self.verif_goals - result.pfc = self.pfc - result.test_type = self.test_type - result.cov_method = self.cov_method - result.cores = self.cores - result.coverage_loc = self.coverage_loc - result.comments = self.comments + # The following attributes were already mandatory in older RISC-V VPTOOL versions. + for attr in [ + "verif_goals", + "pfc", "test_type", "cov_method", "cores", "coverage_loc", "comments", + ]: + setattr(result, attr, getattr(self, attr)) return result def attrval2str(self, attr): @@ -289,6 +302,8 @@ class Subfeature: self.tag = tag # Index of the next item to be added (MUST INCREASE ON EVERY ADDITION!) self.next_elt_id = 0 + # Display order of the Subfeature + self.display_order = 0 # List of Verification Items in this feature: an OrderedDict. self.items = OrderedDict() @@ -312,6 +327,14 @@ class Subfeature: def get_item_names(self): return [item.name for item in self.items.values()] + def to_Prop(self): + """ + Convert a Subfeature into legacy-stype Prop object. + """ + result = Prop(self.name, self.tag, self.display_order) + result.list_of_items = [[elt[0], elt[1].to_Item()] for elt in self.items.items()] + return result + class Prop: """ A Property defines a specific behaviour or an IP section, to be tested/verified @@ -347,6 +370,7 @@ class Prop: if max_item_id >= self.item_count: raise ValueError((self.item_count, max_item_id)) result.next_elt_id = 1 + max_item_id + result.display_order = self.wid_order translated_items = [[elt[0], elt[1].to_VerifItem()] for elt in (self.item_list if self.item_list else self.rfu_list)] result.items = OrderedDict(translated_items) return result @@ -471,10 +495,14 @@ class Feature: else: self.__class__._highest_id += 1 self.id = self.__class__._highest_id - # Index of the Feature (for display ordering) - #self.index = index + # Display order of the Feature + self.display_order = self.id # List of subfeatures self.subfeatures = OrderedDict() + self.vptool_gitrev = '' + self.io_fmt_gitrev = '' + self.config_gitrev = '' + self.ymlcfg_gitrev = '' def __str__(self): return format("## Feature: %s\n\n" % (self.name)) @@ -506,6 +534,17 @@ class Feature: def del_subfeature(self, name): del self.subfeatures[str(name)] + def to_Ip(self): + """ + Convert a Feature to a legacy-stype Ip. + """ + result = Ip(self.name) + result.wid_order = self.display_order + result.prop_list = [[elt[0], elt[1].toSubfeature()] for elt in self.subfeatures.items()] + for attr in ["vptool_gitrev", "io_fmt_gitrev", "config_gitrev", "ymlcfg_gitrev"]: + setattr(result, attr, getattr(self, attr)) + return result + class Ip: """ An IP defines a bloc instantiated at chip top level, or more generally, a design specification chapter @@ -530,6 +569,10 @@ class Ip: self.rfu_list = [] self.rfu_list_0 = [] self.rfu_list_1 = [] + self.vptool_gitrev = '' + self.io_fmt_gitrev = '' + self.config_gitrev = '' + self.ymlcfg_gitrev = '' def to_Feature(self): """ @@ -539,8 +582,11 @@ class Ip: # Next_elf_it needs extra care as it is derived from the length of the list # of Properties / Subfeatures. result.next_elt_id = self.prop_count + result.display_order = self.wid_order translated_subfeatures = [[elt[0], elt[1].to_Subfeature()] for elt in (self.prop_list if self.prop_list else self.rfu_list)] result.subfeatures = OrderedDict(translated_subfeatures) + for attr in ["vptool_gitrev", "io_fmt_gitrev", "config_gitrev", "ymlcfg_gitrev"]: + setattr(result, attr, getattr(self, attr)) return result def __str__(self): From 7858054ea7c275cca342d6068f4b227f6fbdd855 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 7 Dec 2022 14:52:06 +0100 Subject: [PATCH 029/183] axi_agent: first version of AXI4 passive agent Signed-off-by: Alae Eddine Ez zejjari --- .../uvma_axi/src/comps/uvma_axi_agent.sv | 75 +++++++++++++ .../uvma_axi_ar_agent/uvma_axi_ar_agent.sv | 35 ++++++ .../uvma_axi_ar_agent/uvma_axi_ar_mon.sv | 88 +++++++++++++++ .../uvma_axi_aw_agent/uvma_axi_aw_agent.sv | 37 +++++++ .../uvma_axi_aw_agent/uvma_axi_aw_mon.sv | 100 +++++++++++++++++ .../uvma_axi_b_agent/uvma_axi_b_agent.sv | 38 +++++++ .../comps/uvma_axi_b_agent/uvma_axi_b_mon.sv | 78 +++++++++++++ .../uvma_axi_r_agent/uvma_axi_r_agent.sv | 37 +++++++ .../comps/uvma_axi_r_agent/uvma_axi_r_mon.sv | 103 ++++++++++++++++++ .../uvma_axi_w_agent/uvma_axi_w_agent.sv | 37 +++++++ .../comps/uvma_axi_w_agent/uvma_axi_w_mon.sv | 79 ++++++++++++++ .../uvma_axi/src/obj/uvma_axi_cntxt.sv | 42 +++++++ .../uvma_axi/src/seq/uvma_axi_ar_item.sv | 47 ++++++++ .../uvma_axi/src/seq/uvma_axi_aw_item.sv | 57 ++++++++++ .../uvma_axi/src/seq/uvma_axi_b_item.sv | 40 +++++++ .../uvma_axi/src/seq/uvma_axi_r_item.sv | 42 +++++++ .../uvma_axi/src/seq/uvma_axi_w_item.sv | 40 +++++++ lib/uvm_agents/uvma_axi/src/uvma_axi_intf.sv | 102 +++++++++++++++++ .../uvma_axi/src/uvma_axi_macros.sv | 26 +++++ .../uvma_axi/src/uvma_axi_pkg.flist | 24 ++++ lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv | 65 +++++++++++ lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv | 21 ++++ 22 files changed, 1213 insertions(+) create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv create mode 100644 lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_item.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_item.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_intf.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_macros.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.flist create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv new file mode 100644 index 000000000..6722f2424 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv @@ -0,0 +1,75 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 (top) agent ****/ + +`ifndef __UVMA_AXI_AGENT_SV__ +`define __UVMA_AXI_AGENT_SV__ + +class uvma_axi_agent_c extends uvm_agent; + + `uvm_component_utils(uvma_axi_agent_c) + + uvma_axi_aw_agent_c aw_agent; + uvma_axi_w_agent_c w_agent; + uvma_axi_b_agent_c b_agent; + uvma_axi_ar_agent_c ar_agent; + uvma_axi_r_agent_c r_agent; + + uvma_axi_cntxt_c cntxt; + + function new(string name = "uvma_axi_agent_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + get_and_set_cntxt(); + retrieve_vif (); + create_components(); + + endfunction : build_phase + + function void get_and_set_cntxt(); + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_info("CNTXT", "Context handle is null; creating", UVM_DEBUG) + cntxt = uvma_axi_cntxt_c::type_id::create("cntxt"); + end + uvm_config_db#(uvma_axi_cntxt_c)::set(this, "*", "cntxt", cntxt); + + endfunction : get_and_set_cntxt + + function void retrieve_vif(); + + if (!uvm_config_db#(virtual uvma_axi_intf)::get(this, "", "axi_vif", cntxt.axi_vi)) begin + `uvm_fatal("VIF", $sformatf("Could not find vif handle of type %s in uvm_config_db", $typename(cntxt.axi_vi))) + end + else begin + `uvm_info("VIF", $sformatf("Found vif handle of type %s in uvm_config_db", $typename(cntxt.axi_vi)), UVM_DEBUG) + end + + endfunction : retrieve_vif + + function void create_components(); + + this.aw_agent = uvma_axi_aw_agent_c :: type_id :: create("aw_agent", this); + this.w_agent = uvma_axi_w_agent_c :: type_id :: create("w_agent", this); + this.b_agent = uvma_axi_b_agent_c :: type_id :: create("b_agent", this); + this.ar_agent = uvma_axi_ar_agent_c :: type_id :: create("ar_agent", this); + this.r_agent = uvma_axi_r_agent_c :: type_id :: create("r_agent", this); + + endfunction : create_components + +endclass : uvma_axi_agent_c + +`endif //__UVMA_AXI_AGENT_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv new file mode 100644 index 000000000..41b056864 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv @@ -0,0 +1,35 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 agent for Read Address****/ + +`ifndef __UVMA_AXI_AR_AGENT_SV__ +`define __UVMA_AXI_AR_AGENT_SV__ + +class uvma_axi_ar_agent_c extends uvm_agent; + + uvma_axi_ar_mon_c monitor; + + `uvm_component_utils_begin(uvma_axi_ar_agent_c) + `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_component_utils_end + + function new(string name = "uvma_axi_ar_agent_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + this.monitor = uvma_axi_ar_mon_c::type_id::create("monitor", this); + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv new file mode 100644 index 000000000..42af17013 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv @@ -0,0 +1,88 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + + +`ifndef __UVMA_AXI_AR_MON_SV__ +`define __UVMA_AXI_AR_MON_SV__ + +class uvma_axi_ar_mon_c extends uvm_monitor; + + `uvm_component_utils(uvma_axi_ar_mon_c) + + uvma_axi_ar_item_c ar_item; + uvm_analysis_port#(uvma_axi_ar_item_c) uvma_ar_mon_port; + uvma_axi_cntxt_c cntxt; + + // Handles to virtual interface modport + virtual uvma_axi_intf.passive passive_mp; + + function new(string name = "uvma_axi_ar_mon_c", uvm_component parent); + super.new(name, parent); + this.uvma_ar_mon_port = new("uvma_ar_mon_port", this); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("build_phase", "monitor cntxt class failed") + end + + passive_mp = cntxt.axi_vi.passive; + + ar_item = uvma_axi_ar_item_c::type_id::create("ar_item", this); + + endfunction + + task run_phase(uvm_phase phase); + + super.run_phase(phase); + monitor_ar_items(); + + endtask: run_phase + + //Process for request from AR channel + task monitor_ar_items(); + + forever begin + if(this.passive_mp.psv_axi_cb.ar_valid) begin + // collect AR signals + `uvm_info(get_type_name(), $sformatf("read address, collect AR signals and send item"), UVM_HIGH) + this.ar_item.ar_id = passive_mp.psv_axi_cb.ar_id; + this.ar_item.ar_addr = passive_mp.psv_axi_cb.ar_addr; + this.ar_item.ar_len = passive_mp.psv_axi_cb.ar_len; + this.ar_item.ar_size = passive_mp.psv_axi_cb.ar_size; + this.ar_item.ar_burst = passive_mp.psv_axi_cb.ar_burst; + this.ar_item.ar_user = passive_mp.psv_axi_cb.ar_user; + this.ar_item.ar_valid = passive_mp.psv_axi_cb.ar_valid; + this.ar_item.ar_ready = passive_mp.psv_axi_cb.ar_ready; + this.ar_item.ar_lock = passive_mp.psv_axi_cb.ar_lock; + end else begin + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + this.ar_item.ar_id = 0; + this.ar_item.ar_addr = 0; + this.ar_item.ar_len = 0; + this.ar_item.ar_size = 0; + this.ar_item.ar_burst = 0; + this.ar_item.ar_user = 0; + this.ar_item.ar_valid = 0; + this.ar_item.ar_ready = 0; + this.ar_item.ar_lock = 0; + end + end + this.uvma_ar_mon_port.write(this.ar_item); + @(passive_mp.psv_axi_cb); + end + endtask: monitor_ar_items + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv new file mode 100644 index 000000000..a7a904d04 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv @@ -0,0 +1,37 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 agent for write address****/ + +`ifndef __UVMA_AXI_AW_AGENT_SV__ +`define __UVMA_AXI_AW_AGENT_SV__ + +class uvma_axi_aw_agent_c extends uvm_agent; + + uvma_axi_aw_mon_c monitor; + + `uvm_component_utils_begin(uvma_axi_aw_agent_c) + `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_component_utils_end + + function new(string name = "uvma_axi_aw_agent_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + this.monitor = uvma_axi_aw_mon_c::type_id::create("monitor", this); + + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv new file mode 100644 index 000000000..eaef23da1 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv @@ -0,0 +1,100 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + + +`ifndef __UVMA_AXI_AW_MON_SV__ +`define __UVMA_AXI_AW_MON_SV__ + +class uvma_axi_aw_mon_c extends uvm_monitor; + + `uvm_component_utils(uvma_axi_aw_mon_c) + + uvma_axi_cntxt_c cntxt; + + uvma_axi_aw_item_c aw_item; + + uvm_analysis_port #(uvma_axi_aw_item_c) uvma_aw_mon_port; + + // Handles to virtual interface modport + virtual uvma_axi_intf.passive passive_mp; + + function new(string name = "uvma_axi_aw_mon_c", uvm_component parent); + super.new(name, parent); + this.uvma_aw_mon_port = new("uvma_aw_mon_port", this); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("build_phase", "monitor cntxt class failed") + end + + passive_mp = cntxt.axi_vi.passive; + + this.aw_item = uvma_axi_aw_item_c::type_id::create("aw_item", this); + + endfunction + + task run_phase(uvm_phase phase); + super.run_phase(phase); + this.monitor_aw_items(); + endtask: run_phase + + // Process for request from AW channel + task monitor_aw_items(); + + forever begin + if(passive_mp.psv_axi_cb.aw_valid) begin + // collect AW signals + `uvm_info(get_type_name(), $sformatf("write address, collect AW signals and send item"), UVM_HIGH) + this.aw_item.aw_id = passive_mp.psv_axi_cb.aw_id; + this.aw_item.aw_addr = passive_mp.psv_axi_cb.aw_addr; + this.aw_item.aw_len = passive_mp.psv_axi_cb.aw_len; + this.aw_item.aw_size = passive_mp.psv_axi_cb.aw_size; + this.aw_item.aw_burst = passive_mp.psv_axi_cb.aw_burst; + this.aw_item.aw_valid = passive_mp.psv_axi_cb.aw_valid; + this.aw_item.aw_ready = passive_mp.psv_axi_cb.aw_ready; + this.aw_item.aw_cache = passive_mp.psv_axi_cb.aw_cache; + this.aw_item.aw_user = passive_mp.psv_axi_cb.aw_user; + this.aw_item.aw_lock = passive_mp.psv_axi_cb.aw_lock; + this.aw_item.aw_prot = passive_mp.psv_axi_cb.aw_prot; + this.aw_item.aw_qos = passive_mp.psv_axi_cb.aw_qos; + this.aw_item.aw_region= passive_mp.psv_axi_cb.aw_region; + this.aw_item.aw_atop = passive_mp.psv_axi_cb.aw_atop; + end else begin + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + this.aw_item.aw_id = 0; + this.aw_item.aw_addr = 0; + this.aw_item.aw_len = 0; + this.aw_item.aw_size = 0; + this.aw_item.aw_burst = 0; + this.aw_item.aw_valid = 0; + this.aw_item.aw_ready = 0; + this.aw_item.aw_cache = 0; + this.aw_item.aw_user = 0; + this.aw_item.aw_lock = 0; + this.aw_item.aw_prot = 0; + this.aw_item.aw_qos = 0; + this.aw_item.aw_region= 0; + this.aw_item.aw_atop = 0; + end + end + this.uvma_aw_mon_port.write(this.aw_item); + @(passive_mp.psv_axi_cb); + end + + endtask: monitor_aw_items + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv new file mode 100644 index 000000000..3dde7702f --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv @@ -0,0 +1,38 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 agent for Write response ****/ + +`ifndef __UVMA_AXI_B_AGENT_SV__ +`define __UVMA_AXI_B_AGENT_SV__ + +class uvma_axi_b_agent_c extends uvm_agent; + + uvma_axi_b_mon_c monitor; + + `uvm_component_utils_begin(uvma_axi_b_agent_c) + `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_component_utils_end + + function new(string name = "uvma_axi_b_agent_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + + this.monitor = uvma_axi_b_mon_c::type_id::create("monitor", this); + + endfunction + +endclass : uvma_axi_b_agent_c + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv new file mode 100644 index 000000000..12062c6e3 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv @@ -0,0 +1,78 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 B channel monitor ****/ + +`ifndef __UVMA_AXI_B_MON_SV__ +`define __UVMA_AXI_B_MON_SV__ + +class uvma_axi_b_mon_c extends uvm_monitor; + + `uvm_component_utils(uvma_axi_b_mon_c) + + uvma_axi_cntxt_c cntxt; + + uvma_axi_b_item_c b_item; + + uvm_analysis_port #(uvma_axi_b_item_c) uvma_b_mon_port; + + // Handles to virtual interface modport + virtual uvma_axi_intf.passive passive_mp; + + extern function new(string name = "uvma_axi_b_mon_c", uvm_component parent); + extern virtual function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + extern task monitor_b_items(); +endclass:uvma_axi_b_mon_c + +function uvma_axi_b_mon_c::new(string name = "uvma_axi_b_mon_c", uvm_component parent); + super.new(name, parent); + this.uvma_b_mon_port = new("uvma_b_mon_port", this); +endfunction + +function void uvma_axi_b_mon_c::build_phase(uvm_phase phase); + + super.build_phase(phase); + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("build_phase", "monitor cntxt class failed") + end + + passive_mp = cntxt.axi_vi.passive; + + this.b_item = uvma_axi_b_item_c::type_id::create("b_item", this); + +endfunction:build_phase + +task uvma_axi_b_mon_c::run_phase(uvm_phase phase); + super.run_phase(phase); + this.monitor_b_items(); +endtask: run_phase + +task uvma_axi_b_mon_c::monitor_b_items(); + + forever begin + + // collect b signals + `uvm_info(get_type_name(), $sformatf("response, collect resp signals from interface"), UVM_LOW) + this.b_item.b_id = passive_mp.psv_axi_cb.b_id; + this.b_item.b_resp = passive_mp.psv_axi_cb.b_resp; + this.b_item.b_user = passive_mp.psv_axi_cb.b_user; + this.b_item.b_valid = passive_mp.psv_axi_cb.b_valid; + this.b_item.b_ready = passive_mp.psv_axi_cb.b_ready; + this.uvma_b_mon_port.write(b_item); + @(passive_mp.psv_axi_cb); + + end + +endtask: monitor_b_items + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv new file mode 100644 index 000000000..e0651e5d9 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv @@ -0,0 +1,37 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 agent for read ****/ + +`ifndef __UVMA_AXI_R_AGENT_SV__ +`define __UVMA_AXI_R_AGENT_SV__ + +class uvma_axi_r_agent_c extends uvm_agent; + + uvma_axi_r_mon_c monitor; + + `uvm_component_utils_begin(uvma_axi_r_agent_c) + `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_component_utils_end + + function new(string name = "uvma_axi_r_agent_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + monitor = uvma_axi_r_mon_c::type_id::create("monitor", this); + + endfunction + +endclass : uvma_axi_r_agent_c + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv new file mode 100644 index 000000000..4d14c2766 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv @@ -0,0 +1,103 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 monitor for R channel ****/ + +`ifndef __UVMA_AXI_R_MON_SV__ +`define __UVMA_AXI_R_MON_SV__ + +class uvma_axi_r_mon_c extends uvm_monitor; + + `uvm_component_utils(uvma_axi_r_mon_c) + + uvma_axi_cntxt_c cntxt; + + uvma_axi_r_item_c r_item; + + uvm_analysis_port #(uvma_axi_r_item_c) uvma_r_mon_port; + + // Handles to virtual interface modport + virtual uvma_axi_intf.passive passive_mp; + + extern function new(string name = "uvma_axi_r_mon_c", uvm_component parent); + extern virtual function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + extern task monitor_r_items(); + extern task observe_reset(); + +endclass:uvma_axi_r_mon_c + +function uvma_axi_r_mon_c::new(string name = "uvma_axi_r_mon_c", uvm_component parent); + + super.new(name, parent); + uvma_r_mon_port = new("uvma_r_mon_port", this); + +endfunction + +function void uvma_axi_r_mon_c::build_phase(uvm_phase phase); + + super.build_phase(phase); + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("build_phase", "monitor cntxt class failed") + end + + passive_mp = cntxt.axi_vi.passive; + + this.r_item = uvma_axi_r_item_c::type_id::create("r_item", this); + +endfunction + +task uvma_axi_r_mon_c::run_phase(uvm_phase phase); + + super.run_phase(phase); + fork + this.observe_reset(); + this.monitor_r_items(); + join_none + +endtask: run_phase + +task uvma_axi_r_mon_c::monitor_r_items(); + forever begin + + // collect R signals + `uvm_info(get_type_name(), $sformatf("read data, collect resp signals from interface"), UVM_HIGH) + this.r_item.r_id = passive_mp.psv_axi_cb.r_id; + this.r_item.r_data = passive_mp.psv_axi_cb.r_data; + this.r_item.r_resp = passive_mp.psv_axi_cb.r_resp; + this.r_item.r_last = passive_mp.psv_axi_cb.r_last; + this.r_item.r_user = passive_mp.psv_axi_cb.r_user; + this.r_item.r_valid = passive_mp.psv_axi_cb.r_valid; + this.r_item.r_ready = passive_mp.psv_axi_cb.r_ready; + + this.uvma_r_mon_port.write(r_item); + @(passive_mp.psv_axi_cb); + + end + +endtask: monitor_r_items + +task uvma_axi_r_mon_c::observe_reset(); + + forever begin + + wait (cntxt.axi_vi.rst_n === 0); + cntxt.reset_state = UVMA_AXI_RESET_STATE_IN_RESET; + `uvm_info(get_type_name(), $sformatf("RESET_STATE_IN_RESET"), UVM_LOW) + wait (cntxt.axi_vi.rst_n === 1); + cntxt.reset_state = UVMA_AXI_RESET_STATE_POST_RESET; + `uvm_info(get_type_name(), $sformatf("RESET_STATE_POST_RESET"), UVM_LOW) + + end + +endtask : observe_reset + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv new file mode 100644 index 000000000..9ba854017 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv @@ -0,0 +1,37 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 W channel agent ****/ + +`ifndef __UVMA_AXI_W_AGENT_SV__ +`define __UVMA_AXI_W_AGENT_SV__ + +class uvma_axi_w_agent_c extends uvm_agent; + + uvma_axi_w_mon_c monitor; + + `uvm_component_utils_begin(uvma_axi_w_agent_c) + `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_component_utils_end + + function new(string name = "uvma_axi_w_agent_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + this.monitor = uvma_axi_w_mon_c::type_id::create("monitor", this); + + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv new file mode 100644 index 000000000..eb1fb3c4c --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv @@ -0,0 +1,79 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 W channel monitor ****/ + +`ifndef __UVMA_AXI_W_MON_SV__ +`define __UVMA_AXI_W_MON_SV__ + +class uvma_axi_w_mon_c extends uvm_monitor; + + `uvm_component_utils(uvma_axi_w_mon_c) + + uvma_axi_cntxt_c cntxt; + + uvma_axi_w_item_c w_item; + + uvm_analysis_port #(uvma_axi_w_item_c) uvma_w_mon_port; + + // Handles to virtual interface modport + virtual uvma_axi_intf.passive passive_mp; + + extern function new(string name = "uvma_axi_w_mon_c", uvm_component parent); + extern virtual function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + extern task monitor_w_items(); + +endclass:uvma_axi_w_mon_c + +function uvma_axi_w_mon_c::new(string name = "uvma_axi_w_mon_c", uvm_component parent); + + super.new(name, parent); + uvma_w_mon_port = new("uvma_w_mon_port", this); + +endfunction + +function void uvma_axi_w_mon_c::build_phase(uvm_phase phase); + + super.build_phase(phase); + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("build_phase", "monitor cntxt class failed") + end + + passive_mp = cntxt.axi_vi.passive; + + w_item = uvma_axi_w_item_c::type_id::create("w_item", this); + +endfunction + +task uvma_axi_w_mon_c::run_phase(uvm_phase phase); + super.run_phase(phase); + monitor_w_items(); +endtask: run_phase + +// Process for request from W channel +task uvma_axi_w_mon_c::monitor_w_items(); + forever begin + `uvm_info(get_type_name(), $sformatf("write data, monitor DUT response and send data"), UVM_HIGH) + w_item.w_strb = passive_mp.psv_axi_cb.w_strb; + w_item.w_data = passive_mp.psv_axi_cb.w_data; + w_item.w_last = passive_mp.psv_axi_cb.w_last; + w_item.w_user = passive_mp.psv_axi_cb.w_user; + w_item.w_valid = passive_mp.psv_axi_cb.w_valid; + w_item.w_ready = passive_mp.psv_axi_cb.w_ready; + this.uvma_w_mon_port.write(this.w_item); + @(passive_mp.psv_axi_cb); + end + +endtask: monitor_w_items + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv new file mode 100644 index 000000000..b11bbbb04 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv @@ -0,0 +1,42 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +`ifndef __UVMA_AXI_CNTXT_SV__ +`define __UVMA_AXI_CNTXT_SV__ + +/** + * Object encapsulating all state variables for all AXI agent + * (uvma_axi_agent_c) components. + */ +class uvma_axi_cntxt_c extends uvm_object; + + // Handle to agent interface + virtual uvma_axi_intf axi_vi; + + uvma_axi_reset_state_enum reset_state = UVMA_AXI_RESET_STATE_PRE_RESET; + + `uvm_object_utils_begin(uvma_axi_cntxt_c) + `uvm_field_enum(uvma_axi_reset_state_enum, reset_state, UVM_DEFAULT) + `uvm_object_utils_end + /** + * Builds events. + */ + extern function new(string name = "uvma_axi_cntxt"); + +endclass : uvma_axi_cntxt_c + + +function uvma_axi_cntxt_c::new(string name = "uvma_axi_cntxt"); + + super.new(name); + +endfunction : new + +`endif // __UVMA_AXI_CNTXT_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv new file mode 100644 index 000000000..e4a2baec8 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv @@ -0,0 +1,47 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 sequence item : Read Address channel ****/ + + +`ifndef __UVMA_AXI_AR_ITEM_SV__ +`define __UVMA_AXI_AR_ITEM_SV__ + +class uvma_axi_ar_item_c extends uvm_sequence_item; + + rand logic [AXI_ID_WIDTH-1:0] ar_id; + rand logic [AXI_ADDR_WIDTH-1:0] ar_addr; + rand logic [7:0] ar_len; + rand logic [2:0] ar_size; + rand logic [1:0] ar_burst; + rand logic [1:0] ar_user; + rand logic ar_valid; + rand logic ar_ready; + rand logic ar_lock; + + `uvm_object_utils_begin(uvma_axi_ar_item_c) + `uvm_field_int(ar_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_addr, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_len, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_size, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_burst, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_user, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_lock, UVM_ALL_ON | UVM_NOPACK); + `uvm_object_utils_end + + function new(string name = "uvma_axi_ar_item_c"); + super.new(name); + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv new file mode 100644 index 000000000..a6b757bdc --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv @@ -0,0 +1,57 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 sequence item : Write address channel ****/ + +`ifndef __UVMA_AXI_AW_ITEM_SV__ +`define __UVMA_AXI_AW_ITEM_SV__ + + +class uvma_axi_aw_item_c extends uvm_sequence_item; + + rand logic [AXI_ID_WIDTH-1:0] aw_id; + rand logic [AXI_ADDR_WIDTH-1:0] aw_addr; + rand logic [AXI_USER_WIDTH-1:0] aw_user; + rand logic [7:0] aw_len; + rand logic [2:0] aw_size; + rand logic [1:0] aw_burst; + rand logic aw_valid; + rand logic aw_ready; + rand logic [3:0] aw_cache; + rand logic aw_lock; + rand logic [2:0] aw_prot; + rand logic [3:0] aw_qos; + rand logic [3:0] aw_region; + rand logic [5:0] aw_atop; + + `uvm_object_utils_begin(uvma_axi_aw_item_c) + `uvm_field_int(aw_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_addr, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_len, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_size, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_burst, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_cache, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_user, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_lock, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_prot, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_qos, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_region, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_atop, UVM_ALL_ON | UVM_NOPACK); + `uvm_object_utils_end + + function new(string name = "uvma_axi_aw_item_c"); + super.new(name); + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_item.sv new file mode 100644 index 000000000..06f54578a --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_item.sv @@ -0,0 +1,40 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 sequence item : Write response channel ****/ + +`ifndef __UVMA_AXI_B_ITEM_SV__ +`define __UVMA_AXI_B_ITEM_SV__ + +class uvma_axi_b_item_c extends uvm_sequence_item; + + rand logic [AXI_ID_WIDTH-1:0] b_id; + rand logic [1:0] b_resp; + rand logic [1:0] b_user; + rand logic b_valid; + rand logic b_ready; + + `uvm_object_param_utils_begin(uvma_axi_b_item_c) + `uvm_field_int(b_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_resp, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_user, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_object_utils_end + + function new(string name = "uvma_axi_b_item_c"); + super.new(name); + endfunction + +endclass + +`endif + + diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_item.sv new file mode 100644 index 000000000..091e44155 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_item.sv @@ -0,0 +1,42 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 sequence item : Read data channel ****/ + +`ifndef __UVMA_AXI_R_ITEM_SV__ +`define __UVMA_AXI_R_ITEM_SV__ + +class uvma_axi_r_item_c extends uvm_sequence_item; + + rand logic [AXI_ID_WIDTH-1:0] r_id; + rand logic [AXI_ADDR_WIDTH-1:0] r_data; + rand logic [1:0] r_resp; + rand logic r_last; + rand logic r_user; + rand logic r_valid; + logic r_ready; + + `uvm_object_utils_begin(uvma_axi_r_item_c) + `uvm_field_int(r_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_data, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_resp, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_last, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_user, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_object_utils_end + + function new(string name = "uvma_axi_r_item_c"); + super.new(name); + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv new file mode 100644 index 000000000..76e23da1d --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv @@ -0,0 +1,40 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 sequence item : Write data channel****/ + +`ifndef __UVMA_AXI_W_ITEM_SV__ +`define __UVMA_AXI_W_ITEM_SV__ + +class uvma_axi_w_item_c extends uvm_sequence_item; + + rand logic [AXI_DATA_WIDTH/8-1:0] w_strb; + rand logic [AXI_DATA_WIDTH-1:0] w_data; + rand logic w_last; + rand logic w_user; + rand logic w_valid; + rand logic w_ready; + + `uvm_object_param_utils_begin(uvma_axi_w_item_c) + `uvm_field_int(w_strb, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_data, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_last, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_user, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_object_utils_end + + function new(string name = "uvma_axi_w_item_c"); + super.new(name); + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_intf.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_intf.sv new file mode 100644 index 000000000..9c72e4a4d --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_intf.sv @@ -0,0 +1,102 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 interface with parametrized : ****/ + +interface uvma_axi_intf #( + parameter AXI_ADDR_WIDTH = `UVMA_AXI_ADDR_MAX_WIDTH, + parameter AXI_DATA_WIDTH = `UVMA_AXI_DATA_MAX_WIDTH, + parameter AXI_USER_WIDTH = `UVMA_AXI_USER_MAX_WIDTH, + parameter AXI_ID_WIDTH = `UVMA_AXI_ID_MAX_WIDTH +) (input bit clk, bit rst_n); + + // AXI4 signals + // Write Address channel + logic [AXI_ID_WIDTH-1:0] aw_id; + logic [AXI_ADDR_WIDTH-1:0] aw_addr; + logic [AXI_USER_WIDTH-1:0] aw_user; + logic [7:0] aw_len; + logic [2:0] aw_size; + logic [1:0] aw_burst; + logic aw_lock; + logic [3:0] aw_cache; + logic [2:0] aw_prot; + logic [3:0] aw_qos; + logic [3:0] aw_region; + logic aw_valid; + logic aw_ready; + logic [5:0] aw_atop; + + //write data channel + logic [AXI_DATA_WIDTH-1:0] w_data; + logic [AXI_DATA_WIDTH/8-1:0] w_strb; + logic [AXI_USER_WIDTH-1:0] w_user; + logic w_last; + logic w_valid; + logic w_ready; + + // write response channel + logic [AXI_ID_WIDTH-1:0] b_id; + logic [AXI_USER_WIDTH-1:0] b_user; + logic [1:0] b_resp; + logic b_valid; + logic b_ready; + + // read address channel + logic [AXI_ID_WIDTH-1:0] ar_id; + logic [AXI_ADDR_WIDTH-1:0] ar_addr; + logic [AXI_USER_WIDTH-1:0] ar_user; + logic [7:0] ar_len; + logic [2:0] ar_size; + logic [1:0] ar_burst; + logic ar_lock; + logic [3:0] ar_cache; + logic [2:0] ar_prot; + logic [3:0] ar_qos; + logic [3:0] ar_region; + logic ar_valid; + logic ar_ready; + + //read data channel + logic [AXI_ID_WIDTH-1:0] r_id; + logic [AXI_DATA_WIDTH-1:0] r_data; + logic [AXI_USER_WIDTH-1:0] r_user; + logic [1:0] r_resp; + logic r_last; + logic r_valid; + logic r_ready; + + + + clocking slv_axi_cb @(posedge clk or rst_n); + output ar_ready, + r_id, r_data, r_resp, r_last, r_valid, r_user, + aw_ready, + w_ready, + b_id, b_resp, b_user, b_valid; + input ar_id, ar_addr, ar_user, ar_len, ar_size, ar_burst, ar_lock, ar_cache, ar_prot, ar_qos, ar_region, ar_valid, + r_ready, + aw_id, aw_addr, aw_user, aw_len, aw_size, aw_burst, aw_lock, aw_cache, aw_prot, aw_qos, aw_region, aw_valid, aw_atop, + w_data, w_strb, w_last, w_user, w_valid, + b_ready; + endclocking: slv_axi_cb + + clocking psv_axi_cb @(posedge clk or rst_n); + input ar_id, ar_addr, ar_user, ar_len, ar_size, ar_burst, ar_lock, ar_cache, ar_prot, ar_qos, ar_region, ar_valid, ar_ready, + r_ready, r_id, r_data, r_resp, r_user, r_last, r_valid, + aw_id, aw_addr, aw_user, aw_len, aw_size, aw_burst, aw_lock, aw_cache, aw_prot, aw_qos, aw_region, aw_valid, aw_atop, aw_ready, + w_data, w_strb, w_last, w_user, w_valid, w_ready, + b_id, b_resp, b_user, b_valid, b_ready; + endclocking: psv_axi_cb + + modport slave (clocking slv_axi_cb); + modport passive (clocking psv_axi_cb); + +endinterface : uvma_axi_intf diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_macros.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_macros.sv new file mode 100644 index 000000000..d4f12190f --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_macros.sv @@ -0,0 +1,26 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +`ifndef __UVMA_AXI_MACROS_SV__ +`define __UVMA_AXI_MACROS_SV__ + + parameter Nr_Slaves = 2; // actually masters, but slaves on the crossbar + parameter Id_Width = 4; // 4 is recommended by AXI standard, so lets stick to it, do not change + parameter Id_Width_Slave = Id_Width + $clog2(Nr_Slaves); + + `define UVMA_AXI_ADDR_MAX_WIDTH 64 + `define UVMA_AXI_DATA_MAX_WIDTH 64 + `define UVMA_AXI_USER_MAX_WIDTH 1 + `define UVMA_AXI_ID_MAX_WIDTH Id_Width_Slave + `define UVMA_AXI_STRB_MAX_WIDTH 8 + + `define per_instance_fcov `ifndef DSIM option.per_instance = 1; `endif + +`endif // __UVMA_AXI_MACROS_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.flist b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.flist new file mode 100644 index 000000000..ed8dae1fd --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.flist @@ -0,0 +1,24 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +// Directories ++incdir+${DV_UVMA_AXI_PATH} ++incdir+${DV_UVMA_AXI_PATH}/src ++incdir+${DV_UVMA_AXI_PATH}/src/obj ++incdir+${DV_UVMA_AXI_PATH}/src/seq ++incdir+${DV_UVMA_AXI_PATH}/src/comps ++incdir+${DV_UVMA_AXI_PATH}/src/comps/uvma_axi_aw_agent ++incdir+${DV_UVMA_AXI_PATH}/src/comps/uvma_axi_w_agent ++incdir+${DV_UVMA_AXI_PATH}/src/comps/uvma_axi_b_agent ++incdir+${DV_UVMA_AXI_PATH}/src/comps/uvma_axi_ar_agent ++incdir+${DV_UVMA_AXI_PATH}/src/comps/uvma_axi_r_agent + +// Files +${DV_UVMA_AXI_PATH}/src/uvma_axi_pkg.sv diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv new file mode 100644 index 000000000..ddcd92d1d --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv @@ -0,0 +1,65 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/***** AXI4 slave agent package *****/ + +`ifndef __UVMA_AXI_PKG_SV__ +`define __UVMA_AXI_PKG_SV__ + +// Pre-processor macros +`include "uvm_macros.svh" +`include "uvma_axi_macros.sv" + + +// Interfaces / Modules / Checkers +`include "uvma_axi_intf.sv" + +package uvma_axi_pkg; + + import uvm_pkg::*; + + localparam NrSlaves = 2; // actually masters, but slaves on the crossbar + localparam IdWidth = 4; // 4 is recommended by AXI standard, so lets stick to it, do not change + localparam IdWidthSlave = IdWidth + $clog2(NrSlaves); + parameter AXI_ADDR_WIDTH = `UVMA_AXI_ADDR_MAX_WIDTH; + parameter AXI_DATA_WIDTH = `UVMA_AXI_DATA_MAX_WIDTH; + parameter AXI_USER_WIDTH = `UVMA_AXI_USER_MAX_WIDTH; + parameter AXI_ID_WIDTH = IdWidthSlave; + parameter NUM_WORDS = 2**24; + + `include "uvma_axi_tdefs.sv" + + // Objects + `include "uvma_axi_cntxt.sv" + + `include "uvma_axi_aw_item.sv" + `include "uvma_axi_w_item.sv" + `include "uvma_axi_b_item.sv" + `include "uvma_axi_ar_item.sv" + `include "uvma_axi_r_item.sv" + + `include "uvma_axi_aw_mon.sv" + `include "uvma_axi_w_mon.sv" + `include "uvma_axi_b_mon.sv" + `include "uvma_axi_ar_mon.sv" + `include "uvma_axi_r_mon.sv" + + + `include "uvma_axi_aw_agent.sv" + `include "uvma_axi_w_agent.sv" + `include "uvma_axi_b_agent.sv" + `include "uvma_axi_ar_agent.sv" + `include "uvma_axi_r_agent.sv" + + `include "uvma_axi_agent.sv" + +endpackage : uvma_axi_pkg + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv new file mode 100644 index 000000000..0b996ce01 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv @@ -0,0 +1,21 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +`ifndef __UVMA_AXI_TDEFS_SV__ +`define __UVMA_AXI_TDEFS_SV__ + + + typedef enum { + UVMA_AXI_RESET_STATE_PRE_RESET, + UVMA_AXI_RESET_STATE_IN_RESET, + UVMA_AXI_RESET_STATE_POST_RESET + } uvma_axi_reset_state_enum; + +`endif // __UVMA_AXI_TDEFS_SV__ From 64513851d017736c2ba3832bd90159308a6c7f4b Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 7 Dec 2022 15:15:42 +0100 Subject: [PATCH 030/183] axi_agent: connect AXI passive agent to cva6 Signed-off-by: Alae Eddine Ez zejjari --- cva6/env/uvme/uvme_cva6_cntxt.sv | 3 ++ cva6/env/uvme/uvme_cva6_env.sv | 3 ++ cva6/env/uvme/uvme_cva6_pkg.sv | 1 + cva6/sim/Makefile | 1 + cva6/tb/uvmt/cva6_tb_wrapper.sv | 53 +++++++++++++++++++++++++++++- cva6/tb/uvmt/uvmt_cva6.flist | 1 + cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv | 4 +++ cva6/tb/uvmt/uvmt_cva6_tb.sv | 6 ++++ 8 files changed, 71 insertions(+), 1 deletion(-) diff --git a/cva6/env/uvme/uvme_cva6_cntxt.sv b/cva6/env/uvme/uvme_cva6_cntxt.sv index 3434ef38a..7973f1869 100644 --- a/cva6/env/uvme/uvme_cva6_cntxt.sv +++ b/cva6/env/uvme/uvme_cva6_cntxt.sv @@ -30,6 +30,7 @@ class uvme_cva6_cntxt_c extends uvm_object; // Agent context handles uvma_clknrst_cntxt_c clknrst_cntxt; uvma_cvxif_cntxt_c cvxif_cntxt; + uvma_axi_cntxt_c axi_cntxt; // Events uvm_event sample_cfg_e; @@ -38,6 +39,7 @@ class uvme_cva6_cntxt_c extends uvm_object; `uvm_object_utils_begin(uvme_cva6_cntxt_c) `uvm_field_object(clknrst_cntxt, UVM_DEFAULT) + `uvm_field_object(axi_cntxt, UVM_DEFAULT) `uvm_field_event(sample_cfg_e , UVM_DEFAULT) `uvm_field_event(sample_cntxt_e, UVM_DEFAULT) `uvm_object_utils_end @@ -56,6 +58,7 @@ function uvme_cva6_cntxt_c::new(string name="uvme_cva6_cntxt"); super.new(name); clknrst_cntxt = uvma_clknrst_cntxt_c::type_id::create("clknrst_cntxt"); + axi_cntxt = uvma_axi_cntxt_c::type_id::create("axi_cntxt"); sample_cfg_e = new("sample_cfg_e" ); sample_cntxt_e = new("sample_cntxt_e"); diff --git a/cva6/env/uvme/uvme_cva6_env.sv b/cva6/env/uvme/uvme_cva6_env.sv index 08b86f20a..ed22eba52 100644 --- a/cva6/env/uvme/uvme_cva6_env.sv +++ b/cva6/env/uvme/uvme_cva6_env.sv @@ -41,6 +41,7 @@ class uvme_cva6_env_c extends uvm_env; // Agents uvma_clknrst_agent_c clknrst_agent; uvma_cvxif_agent_c cvxif_agent; + uvma_axi_agent_c axi_agent; @@ -209,6 +210,7 @@ function void uvme_cva6_env_c::assign_cntxt(); uvm_config_db#(uvme_cva6_cntxt_c)::set(this, "*", "cntxt", cntxt); uvm_config_db#(uvma_clknrst_cntxt_c)::set(this, "clknrst_agent", "cntxt", cntxt.clknrst_cntxt); + uvm_config_db#(uvma_axi_cntxt_c)::set(this, "axi_agent", "cntxt", cntxt.axi_cntxt); endfunction: assign_cntxt @@ -217,6 +219,7 @@ function void uvme_cva6_env_c::create_agents(); clknrst_agent = uvma_clknrst_agent_c::type_id::create("clknrst_agent", this); cvxif_agent = uvma_cvxif_agent_c::type_id::create("cvxif_agent", this); + axi_agent = uvma_axi_agent_c::type_id::create("axi_agent", this); endfunction: create_agents diff --git a/cva6/env/uvme/uvme_cva6_pkg.sv b/cva6/env/uvme/uvme_cva6_pkg.sv index bde6e08f1..ea93a206e 100644 --- a/cva6/env/uvme/uvme_cva6_pkg.sv +++ b/cva6/env/uvme/uvme_cva6_pkg.sv @@ -43,6 +43,7 @@ package uvme_cva6_pkg; import uvml_trn_pkg ::*; import uvma_clknrst_pkg::*; import uvma_cvxif_pkg::*; + import uvma_axi_pkg::*; // Constants / Structs / Enums `include "uvme_cva6_constants.sv" diff --git a/cva6/sim/Makefile b/cva6/sim/Makefile index bcceaee51..bb8bd4231 100644 --- a/cva6/sim/Makefile +++ b/cva6/sim/Makefile @@ -140,6 +140,7 @@ export DV_UVML_HRTBT_PATH = $(CORE_V_VERIF)/lib/uvm_libs/uvml_hrtbt export DV_UVMA_ISACOV_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_isacov export DV_UVMA_CLKNRST_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_clknrst export DV_UVMA_CVXIF_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_cvxif +export DV_UVMA_AXI_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_axi export DV_UVMA_INTERRUPT_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_interrupt export DV_UVMA_DEBUG_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_debug export DV_UVMA_OBI_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_obi diff --git a/cva6/tb/uvmt/cva6_tb_wrapper.sv b/cva6/tb/uvmt/cva6_tb_wrapper.sv index 7debb4571..f1d740430 100644 --- a/cva6/tb/uvmt/cva6_tb_wrapper.sv +++ b/cva6/tb/uvmt/cva6_tb_wrapper.sv @@ -46,7 +46,8 @@ module cva6_tb_wrapper #( output wire tb_exit_o, output ariane_rvfi_pkg::rvfi_port_t rvfi_o, input cvxif_pkg::cvxif_resp_t cvxif_resp, - output cvxif_pkg::cvxif_req_t cvxif_req + output cvxif_pkg::cvxif_req_t cvxif_req, + uvma_axi_intf axi_slave ); ariane_axi::req_t axi_ariane_req; @@ -156,6 +157,56 @@ module cva6_tb_wrapper #( .rdata_o ( rdata ) ); + // AW Channel + assign axi_slave.aw_valid = cva6_axi_bus.aw_valid; + assign axi_slave.aw_ready = cva6_axi_bus.aw_ready; + assign axi_slave.aw_id = cva6_axi_bus.aw_id; + assign axi_slave.aw_addr = cva6_axi_bus.aw_addr; + assign axi_slave.aw_len = cva6_axi_bus.aw_len; + assign axi_slave.aw_size = cva6_axi_bus.aw_size; + assign axi_slave.aw_burst = cva6_axi_bus.aw_burst; + assign axi_slave.aw_lock = cva6_axi_bus.aw_lock; + assign axi_slave.aw_cache = cva6_axi_bus.aw_cache; + assign axi_slave.aw_prot = cva6_axi_bus.aw_prot; + assign axi_slave.aw_qos = cva6_axi_bus.aw_qos; + assign axi_slave.aw_region = cva6_axi_bus.aw_region; + assign axi_slave.aw_user = cva6_axi_bus.aw_user; + assign axi_slave.aw_atop = cva6_axi_bus.aw_atop; + // W Channel + assign axi_slave.w_valid = cva6_axi_bus.w_valid; + assign axi_slave.w_ready = cva6_axi_bus.w_ready; + assign axi_slave.w_data = cva6_axi_bus.w_data; + assign axi_slave.w_strb = cva6_axi_bus.w_strb; + assign axi_slave.w_last = cva6_axi_bus.w_last; + assign axi_slave.w_user = cva6_axi_bus.w_user; + // B Channel + assign axi_slave.b_valid = cva6_axi_bus.b_valid; + assign axi_slave.b_ready = cva6_axi_bus.b_ready; + assign axi_slave.b_id = cva6_axi_bus.b_id; + assign axi_slave.b_resp = cva6_axi_bus.b_resp; + assign axi_slave.b_user = cva6_axi_bus.b_user; + // AR Channel + assign axi_slave.ar_valid = cva6_axi_bus.ar_valid; + assign axi_slave.ar_ready = cva6_axi_bus.ar_ready; + assign axi_slave.ar_id = cva6_axi_bus.ar_id; + assign axi_slave.ar_addr = cva6_axi_bus.ar_addr; + assign axi_slave.ar_len = cva6_axi_bus.ar_len; + assign axi_slave.ar_size = cva6_axi_bus.ar_size; + assign axi_slave.ar_burst = cva6_axi_bus.ar_burst; + assign axi_slave.ar_lock = cva6_axi_bus.ar_lock; + assign axi_slave.ar_cache = cva6_axi_bus.ar_cache; + assign axi_slave.ar_prot = cva6_axi_bus.ar_prot; + assign axi_slave.ar_qos = cva6_axi_bus.ar_qos; + assign axi_slave.ar_region = cva6_axi_bus.ar_region; + assign axi_slave.ar_user = cva6_axi_bus.ar_user; + // R Channel + assign axi_slave.r_valid = cva6_axi_bus.r_valid; + assign axi_slave.r_ready = cva6_axi_bus.r_ready; + assign axi_slave.r_id = cva6_axi_bus.r_id; + assign axi_slave.r_data = cva6_axi_bus.r_data; + assign axi_slave.r_resp = cva6_axi_bus.r_resp; + assign axi_slave.r_last = cva6_axi_bus.r_last; + assign axi_slave.r_user = cva6_axi_bus.r_user; initial begin automatic logic [7:0][7:0] mem_row; longint address; diff --git a/cva6/tb/uvmt/uvmt_cva6.flist b/cva6/tb/uvmt/uvmt_cva6.flist index 49cf15562..d70c0ab92 100644 --- a/cva6/tb/uvmt/uvmt_cva6.flist +++ b/cva6/tb/uvmt/uvmt_cva6.flist @@ -23,6 +23,7 @@ // Agents -f ${DV_UVMA_CLKNRST_PATH}/uvma_clknrst_pkg.flist -f ${DV_UVMA_CVXIF_PATH}/src/uvma_cvxif_pkg.flist +-f ${DV_UVMA_AXI_PATH}/src/uvma_axi_pkg.flist // Environments -f ${CVA6_UVME_PATH}/uvme_cva6_pkg.flist diff --git a/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv b/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv index ebbd213e5..973c8e7db 100644 --- a/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv +++ b/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv @@ -24,10 +24,13 @@ module uvmt_cva6_dut_wrap # ( parameter int unsigned AXI_USER_WIDTH = 1, ( uvma_clknrst_if clknrst_if, uvma_cvxif_intf cvxif_if, + uvma_axi_intf axi_if, output wire tb_exit_o, output ariane_rvfi_pkg::rvfi_port_t rvfi_o ); + + cva6_tb_wrapper #( .AXI_USER_WIDTH (AXI_USER_WIDTH), .AXI_USER_EN (AXI_USER_EN), @@ -40,6 +43,7 @@ module uvmt_cva6_dut_wrap # ( parameter int unsigned AXI_USER_WIDTH = 1, .rst_ni ( clknrst_if.reset_n ), .cvxif_resp ( cvxif_if.cvxif_resp_o ), .cvxif_req ( cvxif_if.cvxif_req_i ), + .axi_slave ( axi_if ), .tb_exit_o ( tb_exit_o ), .rvfi_o ( rvfi_o ) ); diff --git a/cva6/tb/uvmt/uvmt_cva6_tb.sv b/cva6/tb/uvmt/uvmt_cva6_tb.sv index 9f402ac9b..8fedee7c1 100644 --- a/cva6/tb/uvmt/uvmt_cva6_tb.sv +++ b/cva6/tb/uvmt/uvmt_cva6_tb.sv @@ -47,6 +47,10 @@ module uvmt_cva6_tb; .clk(clknrst_if.clk), .reset_n(clknrst_if.reset_n) ); // cvxif from the cvxif agent + uvma_axi_intf axi_if( + .clk(clknrst_if.clk), + .rst_n(clknrst_if.reset_n) + ); //bind assertion module for cvxif interface bind uvmt_cva6_dut_wrap @@ -72,6 +76,7 @@ module uvmt_cva6_tb; ) cva6_dut_wrap ( .clknrst_if(clknrst_if), .cvxif_if (cvxif_if), + .axi_if (axi_if), .tb_exit_o(), .rvfi_o(rvfi_if.rvfi_o) ); @@ -88,6 +93,7 @@ module uvmt_cva6_tb; // Add interfaces handles to uvm_config_db uvm_config_db#(virtual uvma_clknrst_if )::set(.cntxt(null), .inst_name("*.env.clknrst_agent"), .field_name("vif"), .value(clknrst_if)); uvm_config_db#(virtual uvma_cvxif_intf )::set(.cntxt(null), .inst_name("*.env.cvxif_agent"), .field_name("vif"), .value(cvxif_if) ); + uvm_config_db#(virtual uvma_axi_intf )::set(.cntxt(null), .inst_name("*"), .field_name("axi_vif"), .value(axi_if)); uvm_config_db#(virtual uvmt_rvfi_if )::set(.cntxt(null), .inst_name("*"), .field_name("rvfi_vif"), .value(rvfi_if)); // DUT and ENV parameters From f9e7cfcdbeefd70d60584a3f5847185e4cd94b41 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Thu, 9 Feb 2023 10:19:17 +0100 Subject: [PATCH 031/183] VPTOOL: Revert Pickle output to protocol 0. Add stable roundtrip Yaml I/O. * tooos/vptool/vptool/vp.py (MyMain.save_db): Revert to human-readable version of Pickle protocol. Change default Yaml files to 'VP_IPnnn.yml'. (MyMain.load_db_quiet): Add arg 'use_yaml_input' to switch between Pickle and Yaml input. Change default Yaml files to 'VP_IPnnn.yml'. Process input according to chosen input mode (Pickle/Yaml). (MyMain.lock_all_ip): Revert to human-readable version of Pickle protocol. (MyMain.create_gui): Add arg 'use_yaml_input' to select load mode. (toplevel): Add '-y'/'--yaml' option to cmdline options. Pass choice to GUI creation. * tools/vptool/vptool/vp_pack.py (Subfeature.to_Prop): Set item_count. Populate rfu_list. Fix name of list of items. (Prop.to_Subfeature): Add debug message (commented out). Accept item count as is. (Feature._highest_id): Rename to '_feature_count'. Start from 0, not -1. (Feature.__init__): Set default value of 'id' arg to "" and check for default ID accordingly, so 0 becomes a valid non-default ID. (Feature.to_Ip): Map id to ip_num. Correctly populate the rfu_list and the prop_list attributes. (Ip.__init__): Check for default index by comparing against default value instead of checking for falseness. Add debug message (commented out). (Ip.to_Feature): Add comment. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp.py | 78 ++++++++++++++++++++-------------- tools/vptool/vptool/vp_pack.py | 37 ++++++++-------- 2 files changed, 64 insertions(+), 51 deletions(-) diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index 900ed0905..755afe774 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -1977,7 +1977,7 @@ class MyMain: + ".pck", "wb", ) as output: - pickle.dump(ip_elt, output, 4) + pickle.dump(ip_elt, output, 0) # TODO: Add translation of pickle_ip_list to new-gen # types *HERE*, after emitting Pickle. # Emit the Yaml output from the fixed structures, @@ -1987,7 +1987,7 @@ class MyMain: save_dir + "/VP_IP" + str(ip_elt[1].ip_num).zfill(3) - + "_new_types.yml", + + ".yml", "wb", ) as output: db_yaml_engine.dump(ip_elt[1].to_Feature(), output) @@ -2010,9 +2010,9 @@ class MyMain: else: # ZC FIXME Add support for Yaml in non-split-save mode. with open(vp_config.SAVED_DB_LOCATION, "wb") as output: - pickle.dump(len(pickle_ip_list), output, 4) + pickle.dump(len(pickle_ip_list), output, 0) for ip_elt in pickle_ip_list: - pickle.dump(ip_elt, output, 4) + pickle.dump(ip_elt, output, 0) self.prep_db_import() # update_ip_widget() self.update_all_item_target_list() @@ -2057,7 +2057,7 @@ class MyMain: tkinter.messagebox.showwarning("Warning", "No DB Loaded!") return need_to_load - def load_db_quiet(self): + def load_db_quiet(self, use_yaml_input=False): pickle_ip_list = [] ip_num_next = 0 if self.split_save: @@ -2073,16 +2073,18 @@ class MyMain: else "" ) + ")", - os.path.join(dir_to_load, "VP_IP*.pck"), + os.path.join(dir_to_load, "VP_IP[0-9][0-9][0-9].pck"), ) ) - for filename in glob.glob(dir_to_load + "/VP_IP*pck"): - # print("---INFO: Loading "+filename) - with open(filename, "rb") as input: - pickle_ip_list.append(pickle.load(input)) - #for filename in glob.glob(dir_to_load + "/VP_IP*yml"): - # with open(filename, "rb") as input: - # pickle_ip_list.append(db_yaml_engine.load(input)) + if not use_yaml_input: + for filename in glob.glob(dir_to_load + "/VP_IP*pck"): + # print("---INFO: Loading "+filename) + with open(filename, "rb") as input: + pickle_ip_list.append(pickle.load(input)) + else: + for filename in glob.glob(dir_to_load + "/VP_IP[0-9][0-9][0-9].yml"): + with open(filename, "rb") as input: + pickle_ip_list.append(db_yaml_engine.load(input)) if pickle_ip_list: # Find the lowest ip_num that can be used for newly created IPs. # It has to be higher than the highest existing ip_num. @@ -2090,8 +2092,8 @@ class MyMain: ip_num_next = 1 + max( [ (lambda e: e if isinstance(e, int) else int(e, base=10))( - #elt.ip_num # Yaml !!omap mode: list of objects - elt[1].ip_num + elt.id if use_yaml_input # Yaml !!omap mode: list of objects + else elt[1].ip_num ) for elt in pickle_ip_list ] @@ -2109,16 +2111,18 @@ class MyMain: for dummy in range(ip_num_next): pickle_ip_list.append(pickle.load(input)) # change list to dict - # Yaml mode: !!omap yields a list of elts when loaded. - #for ip_elt in pickle_ip_list: - # self.ip_list[ip_elt.name] = ip_elt - # # Seems pickle doesn't restore class attribute. Done manually here for IP - # self.ip_list[ip_elt.name].__class__._ip_count = ip_num_next - # Pickle mode: list of objects is a list of mappings - for ip_key, ip_elt in pickle_ip_list: - self.ip_list[ip_key] = ip_elt - # Seems pickle doesn't restore class attribute. Done manually here for IP - self.ip_list[ip_key].__class__._ip_count = ip_num_next + if use_yaml_input: + # Yaml mode: !!omap yields a list of elts when loaded. + for ip_elt in pickle_ip_list: + self.ip_list[ip_elt.name] = ip_elt.to_Ip() + # Seems pickle doesn't restore class attribute. Done manually here for IP + self.ip_list[ip_elt.name].__class__._ip_count = ip_num_next + else: + # Pickle mode: list of objects is a list of mappings as 2-elt lists + for ip_key, ip_elt in pickle_ip_list: + self.ip_list[ip_key] = ip_elt + # Seems pickle doesn't restore class attribute. Done manually here for IP + self.ip_list[ip_key].__class__._ip_count = ip_num_next self.prep_db_import() self.update_all_item_target_list() self.db_git_rev = self.get_db_gitrev() @@ -2177,7 +2181,7 @@ class MyMain: LOCKED_IP_DICT[current_ip_name] = pwd.getpwuid(os.getuid()).pw_name try: with open(vp_config.LOCKED_IP_LOCATION, "wb") as output: - pickle.dump(LOCKED_IP_DICT, output, 4) + pickle.dump(LOCKED_IP_DICT, output, 0) self.update_ip_widget() except Exception as e: print( @@ -2200,7 +2204,7 @@ class MyMain: LOCKED_IP_DICT[current_ip_name] = pwd.getpwuid(os.getuid()).pw_name try: with open(vp_config.LOCKED_IP_LOCATION, "wb") as output: - pickle.dump(LOCKED_IP_DICT, output, 4) + pickle.dump(LOCKED_IP_DICT, output, 0) self.update_ip_widget() except Exception as e: print( @@ -2279,9 +2283,9 @@ class MyMain: if os.path.exists(sys.argv[0]): preference_file = os.path.dirname(sys.argv[0]) + "/" + PERSO_FILE with open(preference_file, "wb") as output: - pickle.dump(BG_COLOR, output, 4) - pickle.dump(EDITOR, output, 4) - pickle.dump(self.verif_menu.enable_image_panel.get(), output, 4) + pickle.dump(BG_COLOR, output, 0) + pickle.dump(EDITOR, output, 0) + pickle.dump(self.verif_menu.enable_image_panel.get(), output, 0) def change_gui_color(self): global BG_COLOR @@ -2342,7 +2346,7 @@ class MyMain: ##### DB INTERACTIION FUNCTIONS ##### Main GUI Creation - def create_gui(self, theme): + def create_gui(self, theme, use_yaml_input): self.personalization() # TOP Widget @@ -2450,7 +2454,7 @@ class MyMain: self.desc_widget.text1.bind("", self.im_up_des_ctrl_lock) self.desc_widget.text.bind("", self.im_up_des_tip_disp) self.item_widget.wlist.bind("<>", self.im_up_item) - self.load_db_quiet() + self.load_db_quiet(use_yaml_input) self.load_lock_ip() self.update_ip_widget() self.top.bind("", self.main_exit_handler) @@ -2481,6 +2485,14 @@ def __generate_option_parser(): help="Select a GUI theme for this session", default=vp_config.yaml_config["gui"]["theme"], ) + parser.add_option( + "-y", + "--yaml", + action="store_true", + dest="use_yaml_input", + help="Read database in Yaml format", + default=False, + ) return parser @@ -2507,4 +2519,4 @@ if os.path.exists(os.path.realpath(options.dataBase)): SAVED_DB_LOCATION = os.path.realpath(options.dataBase) print(SAVED_DB_LOCATION) -top_gui.create_gui(options.theme) +top_gui.create_gui(options.theme, options.use_yaml_input) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index d9d5324a1..baf6c35c3 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -332,7 +332,9 @@ class Subfeature: Convert a Subfeature into legacy-stype Prop object. """ result = Prop(self.name, self.tag, self.display_order) - result.list_of_items = [[elt[0], elt[1].to_Item()] for elt in self.items.items()] + result.item_count = self.next_elt_id + result.rfu_list = [[elt[0], elt[1].to_Item()] for elt in self.items.items()] + result.item_list = dict(result.rfu_list) return result class Prop: @@ -365,11 +367,8 @@ class Prop: # numbering of Items in Prop and will be inconsistent if items are removed. # Computing the max of item IDs is not reliable either in case the last # item was removed. + 3print("### Prop.to_Subfeature(tag='%s'): item_count = %d" % (self.tag, self.item_count)) result.next_elt_id = self.item_count - max_item_id = max([int(elt[1].name) for elt in (self.item_list if self.item_list else self.rfu_list)]) - if max_item_id >= self.item_count: - raise ValueError((self.item_count, max_item_id)) - result.next_elt_id = 1 + max_item_id result.display_order = self.wid_order translated_items = [[elt[0], elt[1].to_VerifItem()] for elt in (self.item_list if self.item_list else self.rfu_list)] result.items = OrderedDict(translated_items) @@ -477,24 +476,20 @@ class Feature: a class of instructions or an operation mode of an interface. """ # Class variable: highest Feature ID seen so far. - _highest_id = -1 + _feature_count = 0 - def __init__(self, name="", id=0): + def __init__(self, name="", id=""): # Index of next subfeature to add (MUST ALWAYS GROW upon adding subfeatures!) self.next_elt_id = 0 # Name of the Feature self.name = name # Numerical ID of the Feature: Use the highest known value PLUS ONE # unless explicitly given (e.g., when converting Ip objects). - if id != 0: - if id > self.__class__._highest_id: - self.__class__._highest_id = id - self.id = id - else: - raise ValueError((id, self.__class__._highest_id)) + if id != "": + self.id = int(id) else: - self.__class__._highest_id += 1 - self.id = self.__class__._highest_id + self.id = self.__class__._feature_count + self.__class__._feature_count += 1 # Display order of the Feature self.display_order = self.id # List of subfeatures @@ -538,9 +533,13 @@ class Feature: """ Convert a Feature to a legacy-stype Ip. """ - result = Ip(self.name) + # Map Feature.id to Ip.ip_num. + #print("### Feature.to_Ip(name='%s', id='%d')" % (self.name, self.id)) + result = Ip(self.name, self.id) + result.prop_count = self.next_elt_id result.wid_order = self.display_order - result.prop_list = [[elt[0], elt[1].toSubfeature()] for elt in self.subfeatures.items()] + result.rfu_list = [[elt[0], elt[1].to_Prop()] for elt in self.subfeatures.items()] + result.prop_list = dict(result.rfu_list) for attr in ["vptool_gitrev", "io_fmt_gitrev", "config_gitrev", "ymlcfg_gitrev"]: setattr(result, attr, getattr(self, attr)) return result @@ -558,10 +557,11 @@ class Ip: self.prop_count = 0 # determine how many prop have been created for a given IP self.name = name self.prop_list = {} - if index: + if index != "": self.ip_num = index ## Store number creation else: self.ip_num = self.__class__._ip_count + #print("### Created Ip(name='%s', index='%d')" % (self.name, self.ip_num)) self.__class__._ip_count += 1 self.wid_order = self.ip_num # rfu for future dev @@ -578,6 +578,7 @@ class Ip: """ Convert an Ip to a Feature. """ + # Map Ip.ip_num to Feature.id. result = Feature(self.name, self.ip_num) # Next_elf_it needs extra care as it is derived from the length of the list # of Properties / Subfeatures. From 16bf162879eb5590480bf9ed06db7c6c54b03e0d Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Thu, 9 Feb 2023 12:40:27 +0100 Subject: [PATCH 032/183] VPTOOL HOTFIX: Fix breaker typo. * tools/vptool/vptool/vp_pack.py (Prop.to_Subfeature): Fix typo commenting out the diagnostic message. Signed-off-by: Zbigniew Chamski --- tools/vptool/vptool/vp_pack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/vptool/vptool/vp_pack.py b/tools/vptool/vptool/vp_pack.py index baf6c35c3..7ee5d6880 100755 --- a/tools/vptool/vptool/vp_pack.py +++ b/tools/vptool/vptool/vp_pack.py @@ -367,7 +367,7 @@ class Prop: # numbering of Items in Prop and will be inconsistent if items are removed. # Computing the max of item IDs is not reliable either in case the last # item was removed. - 3print("### Prop.to_Subfeature(tag='%s'): item_count = %d" % (self.tag, self.item_count)) + #print("### Prop.to_Subfeature(tag='%s'): item_count = %d" % (self.tag, self.item_count)) result.next_elt_id = self.item_count result.display_order = self.wid_order translated_items = [[elt[0], elt[1].to_VerifItem()] for elt in (self.item_list if self.item_list else self.rfu_list)] From 3e2b547217f320e5997f9a8a6b6927c737df5e51 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 13 Feb 2023 10:23:40 +0100 Subject: [PATCH 033/183] VPTOOL: Switch to Yaml storage. Prepare to switch DVplans to Yaml form. * cva6/docs/VerifPlans/FRONTEND/runme.sh: Pass cmdline options to VPTOOL. * cva6/docs/VerifPlans/ISA_RV32/runme.sh: Ditto. * tools/vptool/vptool/vp.py (MyMain.save_db): Save databases as Yaml. (MyMain.load_db_quiet): By default, load DB from the Yaml files. Use "yml" extension in window title when using Yaml DB files. (__generate_option_parser): Add option to select Pickle input. Set defaults to Yaml for both Yaml and Pickle format option. Signed-off-by: Zbigniew Chamski --- cva6/docs/VerifPlans/FRONTEND/runme.sh | 2 +- cva6/docs/VerifPlans/ISA_RV32/runme.sh | 2 +- tools/vptool/vptool/vp.py | 38 ++++++++++++++++---------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/cva6/docs/VerifPlans/FRONTEND/runme.sh b/cva6/docs/VerifPlans/FRONTEND/runme.sh index 3a79359e9..fb0023f98 100644 --- a/cva6/docs/VerifPlans/FRONTEND/runme.sh +++ b/cva6/docs/VerifPlans/FRONTEND/runme.sh @@ -31,4 +31,4 @@ export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` # FIXME: Introduce a suitably named shell variable that points to the root # directory of the tool set (TOOL_TOP etc.) # FORNOW use a hardcoded relative path. -python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py -t winxpblue +python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py $* diff --git a/cva6/docs/VerifPlans/ISA_RV32/runme.sh b/cva6/docs/VerifPlans/ISA_RV32/runme.sh index 8cc952c8a..b301c7850 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/runme.sh +++ b/cva6/docs/VerifPlans/ISA_RV32/runme.sh @@ -31,4 +31,4 @@ export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` # FIXME: Introduce a suitably named shell variable that points to the root # directory of the tool set (TOOL_TOP etc.) # FORNOW use a hardcoded relative path. -python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py -t winxpblue +python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py $* diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index 755afe774..03047594b 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -1968,20 +1968,21 @@ class MyMain: "yaml_cfg_gitrev" ] # Save individual IPs only if locked by user. - if self.is_locked_by_user(current_ip_name=ip_elt[1].name): - saved_ip_str += "\n " + ip_elt[1].name - with open( - save_dir - + "/VP_IP" - + str(ip_elt[1].ip_num).zfill(3) - + ".pck", - "wb", - ) as output: - pickle.dump(ip_elt, output, 0) + #if self.is_locked_by_user(current_ip_name=ip_elt[1].name): + # saved_ip_str += "\n " + ip_elt[1].name + # with open( + # save_dir + # + "/VP_IP" + # + str(ip_elt[1].ip_num).zfill(3) + # + ".pck", + # "wb", + # ) as output: + # pickle.dump(ip_elt, output, 0) # TODO: Add translation of pickle_ip_list to new-gen # types *HERE*, after emitting Pickle. # Emit the Yaml output from the fixed structures, # skipping pickled ones. + saved_ip_str += "\n " + ip_elt[1].name # Write yaml output with open( save_dir @@ -2057,7 +2058,7 @@ class MyMain: tkinter.messagebox.showwarning("Warning", "No DB Loaded!") return need_to_load - def load_db_quiet(self, use_yaml_input=False): + def load_db_quiet(self, use_yaml_input=True): pickle_ip_list = [] ip_num_next = 0 if self.split_save: @@ -2073,11 +2074,11 @@ class MyMain: else "" ) + ")", - os.path.join(dir_to_load, "VP_IP[0-9][0-9][0-9].pck"), + os.path.join(dir_to_load, "VP_IP[0-9][0-9][0-9].%s" % ("yml" if use_yaml_input else "pck")), ) ) if not use_yaml_input: - for filename in glob.glob(dir_to_load + "/VP_IP*pck"): + for filename in glob.glob(dir_to_load + "/VP_IP[0-9][0-9][0-9].pck"): # print("---INFO: Loading "+filename) with open(filename, "rb") as input: pickle_ip_list.append(pickle.load(input)) @@ -2491,8 +2492,17 @@ def __generate_option_parser(): action="store_true", dest="use_yaml_input", help="Read database in Yaml format", - default=False, + default=True, ) + parser.add_option( + "-p", + "--pickle", + action="store_false", + dest="use_yaml_input", + help="Read database in Pickle format", + default=True, + ) + return parser From c34e480faf5ff39e1017f3fe0bdb06cb280e5eb5 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 13 Feb 2023 11:29:24 +0100 Subject: [PATCH 034/183] DV plans: Switch FRONTEND DV plan to Yaml format. * cva6/docs/VerifPlans/FRONTEND/VP_IP003.yml: New. * cva6/docs/VerifPlans/FRONTEND/VP_IP004.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP005.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP006.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP007.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP008.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP009.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP010.yml: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP003.pck: Delete. * cva6/docs/VerifPlans/FRONTEND/VP_IP004.pck: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP005.pck: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP006.pck: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP007.pck: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP008.pck: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP009.pck: Ditto. * cva6/docs/VerifPlans/FRONTEND/VP_IP010.pck: Ditto. Signed-off-by: Zbigniew Chamski --- cva6/docs/VerifPlans/FRONTEND/VP_IP003.pck | 1198 -------------------- cva6/docs/VerifPlans/FRONTEND/VP_IP003.yml | 422 +++++++ cva6/docs/VerifPlans/FRONTEND/VP_IP004.pck | 384 ------- cva6/docs/VerifPlans/FRONTEND/VP_IP004.yml | 104 ++ cva6/docs/VerifPlans/FRONTEND/VP_IP005.pck | 508 --------- cva6/docs/VerifPlans/FRONTEND/VP_IP005.yml | 152 +++ cva6/docs/VerifPlans/FRONTEND/VP_IP006.pck | 384 ------- cva6/docs/VerifPlans/FRONTEND/VP_IP006.yml | 104 ++ cva6/docs/VerifPlans/FRONTEND/VP_IP007.pck | 232 ---- cva6/docs/VerifPlans/FRONTEND/VP_IP007.yml | 66 ++ cva6/docs/VerifPlans/FRONTEND/VP_IP008.pck | 308 ----- cva6/docs/VerifPlans/FRONTEND/VP_IP008.yml | 80 ++ cva6/docs/VerifPlans/FRONTEND/VP_IP009.pck | 59 - cva6/docs/VerifPlans/FRONTEND/VP_IP009.yml | 10 + cva6/docs/VerifPlans/FRONTEND/VP_IP010.pck | 376 ------ cva6/docs/VerifPlans/FRONTEND/VP_IP010.yml | 114 ++ 16 files changed, 1052 insertions(+), 3449 deletions(-) delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP003.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP003.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP004.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP004.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP005.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP005.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP006.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP006.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP007.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP007.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP008.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP008.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP009.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP009.yml delete mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP010.pck create mode 100644 cva6/docs/VerifPlans/FRONTEND/VP_IP010.yml diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP003.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP003.pck deleted file mode 100644 index a5d1c4861..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP003.pck +++ /dev/null @@ -1,1198 +0,0 @@ -(VPC generation stage -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I10 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I3 -sVwid_order -p12 -I3 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V001_BTB -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I6 -sg8 -g17 -sVtag -p23 -VVP_IP003_P001 -p24 -sVitem_list -p25 -(dp26 -sg12 -I1 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F003_S001_I000 -p34 -sVdescription -p35 -VIf instruction is a JALR and BTB (Branch Target Buffer) returns a valid address, next PC is predicted by BTB. Else JALR is not considered as a control flow instruction, which will generate a mispredict. -p36 -sVpurpose -p37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p38 -sVverif_goals -p39 -VExecute a JALR instruction with a valid address in BTB which is not a misprediction. Check that instruction queue is not flushed. -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I4 -sVtest_type -p44 -I0 -sVcov_method -p45 -I1 -sVcores -p46 -I16 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_FRONTEND_F003_S001_I001 -p62 -sg35 -VIf instruction is a JALR and BTB (Branch Target Buffer) returns a valid address, next PC is predicted by BTB. Else JALR is not considered as a control flow instruction, which will generate a mispredict. -p63 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p64 -sg39 -VExecute a JALR instruction with a valid address in BTB which is a misprediction. -p65 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -a(V002 -p71 -g1 -(g29 -g3 -Ntp72 -Rp73 -(dp74 -g8 -V002 -p75 -sg23 -VVP_FRONTEND_F003_S001_I002 -p76 -sg35 -VIf instruction is a JALR and BTB (Branch Target Buffer) returns a valid address, next PC is predicted by BTB.\u000a\u000aElse JALR is not considered as a control flow instruction, which will generate a mispredict. -p77 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p78 -sg39 -VExecute test with JALR instructions. Functional cov: JALR is executed and BTB output is not valid. -p79 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp80 -sg15 -(lp81 -sg52 -(lp82 -sg13 -(dp83 -g55 -I0 -ssbtp84 -asVrfu_list_1 -p85 -(lp86 -sg52 -(lp87 -sg13 -(dp88 -sbtp89 -a(V002_BHT -p90 -g1 -(g18 -g3 -Ntp91 -Rp92 -(dp93 -g22 -I4 -sg8 -g90 -sg23 -VVP_IP003_P002 -p94 -sg25 -(dp95 -sg12 -I2 -sg15 -(lp96 -(V000 -p97 -g1 -(g29 -g3 -Ntp98 -Rp99 -(dp100 -g8 -V000 -p101 -sg23 -VVP_FRONTEND_F003_S002_I000 -p102 -sg35 -VIf instruction is a branch and BTH (Branch History table) returns a valid address, next PC is predicted by BHT. Else branch is not considered as an control flow instruction, which will generate a mispredict when branch is taken. -p103 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p104 -sg39 -VExecute a BRANCH instruction with a valid address in BHT which is not a misprediction. Check that instruction queue is not flushed. -p105 -sg41 -g42 -sg43 -I4 -sg44 -I0 -sg45 -I1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp106 -sg15 -(lp107 -sg52 -(lp108 -sg13 -(dp109 -Vlock_status -p110 -I0 -ssbtp111 -a(V001 -p112 -g1 -(g29 -g3 -Ntp113 -Rp114 -(dp115 -g8 -V001 -p116 -sg23 -VVP_FRONTEND_F003_S002_I001 -p117 -sg35 -VIf instruction is a branch and BTH (Branch History table) returns a valid address, next PC is predicted by BHT. Else branch is not considered as an control flow instruction, which will generate a mispredict when branch is taken. -p118 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p119 -sg39 -VExecute a BRANCH instruction with a valid address in BHT which is a misprediction. -p120 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp121 -sg15 -(lp122 -sg52 -(lp123 -sg13 -(dp124 -Vlock_status -p125 -I0 -ssbtp126 -a(V002 -p127 -g1 -(g29 -g3 -Ntp128 -Rp129 -(dp130 -g8 -V002 -p131 -sg23 -VVP_FRONTEND_F003_S002_I002 -p132 -sg35 -VIf instruction is a branch and BTH (Branch History table) returns a valid address, next PC is predicted by BHT. Else branch is not considered as an control flow instruction, which will generate a mispredict when branch is taken. -p133 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p134 -sg39 -VExecute test with BRANCH instructions. Functional cov: a BRANCH is executed, BTB output is not valid and the branch is taken. -p135 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp136 -sg15 -(lp137 -sg52 -(lp138 -sg13 -(dp139 -g125 -I0 -ssbtp140 -asg85 -(lp141 -sg52 -(lp142 -sg13 -(dp143 -sbtp144 -a(V003_RAS -p145 -g1 -(g18 -g3 -Ntp146 -Rp147 -(dp148 -g22 -I4 -sg8 -g145 -sg23 -VVP_IP003_P003 -p149 -sg25 -(dp150 -sg12 -I3 -sg15 -(lp151 -(V000 -p152 -g1 -(g29 -g3 -Ntp153 -Rp154 -(dp155 -g8 -V000 -p156 -sg23 -VVP_FRONTEND_F003_S003_I000 -p157 -sg35 -VIf instruction is a RET and RAS (Return Address Stack) returns a valid address and RET has already been consummed by instruction queue. Else RET is considered as a control flow instruction but next PC is not predicted. A mispredict wil be generated. -p158 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p159 -sg39 -VExecute a RET instruction with a valid address in RAS. Check that instruction queue is not flushed. -p160 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp161 -sg15 -(lp162 -sg52 -(lp163 -sg13 -(dp164 -g125 -I0 -ssbtp165 -a(V001 -p166 -g1 -(g29 -g3 -Ntp167 -Rp168 -(dp169 -g8 -V001 -p170 -sg23 -VVP_FRONTEND_F003_S003_I001 -p171 -sg35 -VIf instruction is a RET and RAS (Return Address Stack) returns a valid address and RET has already been consummed by instruction queue. Else RET is considered as a control flow instruction but next PC is not predicted. A mispredict wil be generated. -p172 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p173 -sg39 -VExecute a RET instruction with a valid address in RAS which is a misprediction. -p174 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp175 -sg15 -(lp176 -sg52 -(lp177 -sg13 -(dp178 -g125 -I0 -ssbtp179 -a(V002 -p180 -g1 -(g29 -g3 -Ntp181 -Rp182 -(dp183 -g8 -V002 -p184 -sg23 -VVP_FRONTEND_F003_S003_I002 -p185 -sg35 -VIf instruction is a RET and RAS (Return Address Stack) returns a valid address and RET has already been consummed by instruction queue. Else RET is considered as a control flow instruction but next PC is not predicted. A mispredict wil be generated. -p186 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Branch Predict -p187 -sg39 -VExecute test with RET instructions. Functional cov: RET is executed and RAS output is not valid. -p188 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp189 -sg15 -(lp190 -sg52 -(lp191 -sg13 -(dp192 -g125 -I0 -ssbtp193 -asg85 -(lp194 -sg52 -(lp195 -sg13 -(dp196 -sbtp197 -a(V004_Return from environment call -p198 -g1 -(g18 -g3 -Ntp199 -Rp200 -(dp201 -g22 -I2 -sg8 -g198 -sg23 -VVP_IP003_P004 -p202 -sg25 -(dp203 -sg12 -I4 -sg15 -(lp204 -(V000 -p205 -g1 -(g29 -g3 -Ntp206 -Rp207 -(dp208 -g8 -V000 -p209 -sg23 -VVP_FRONTEND_F003_S004_I000 -p210 -sg35 -VWhen CSR asks a return from an environment call, the PC is assigned to the successive PC to the one stored in the CSR [m-s]epc register. -p211 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Return from env call -p212 -sg39 -VSet two different addresses for mepc and sepc in CSR registers. Use a arc_test returning from machine env call.\u000a\u000a* Check by assertion that when machine return occurs the mepc address is fetched.\u000a* Functional cov: execute a machine return. -p213 -sg41 -g42 -sg43 -I4 -sg44 -I0 -sg45 -I1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp214 -sg15 -(lp215 -sg52 -(lp216 -sg13 -(dp217 -g125 -I0 -ssbtp218 -a(V001 -p219 -g1 -(g29 -g3 -Ntp220 -Rp221 -(dp222 -g8 -V001 -p223 -sg23 -VVP_FRONTEND_F003_S004_I001 -p224 -sg35 -VWhen CSR asks a return from an environment call, the PC is assigned to the successive PC to the one stored in the CSR [m-s]epc register. -p225 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Return from env call -p226 -sg39 -VSet two different addresses for mepc and sepc in CSR registers. Use a returning from supervisor env call.\u000a\u000a* Check by assertion that when supervisor return occurs the sepc address is fetched.\u000a* Functional cov: execute a supervisor return. -p227 -sg41 -g42 -sg43 -I4 -sg44 -I0 -sg45 -I1 -sg46 -I24 -sg47 -g42 -sg48 -g42 -sg49 -(lp228 -sg15 -(lp229 -sg52 -(lp230 -sg13 -(dp231 -g125 -I0 -ssbtp232 -asg85 -(lp233 -sg52 -(lp234 -sg13 -(dp235 -sbtp236 -a(V005_Exception/Interrupt -p237 -g1 -(g18 -g3 -Ntp238 -Rp239 -(dp240 -g22 -I2 -sg8 -g237 -sg23 -VVP_IP003_P005 -p241 -sg25 -(dp242 -sg12 -I5 -sg15 -(lp243 -(V000 -p244 -g1 -(g29 -g3 -Ntp245 -Rp246 -(dp247 -g8 -V000 -p248 -sg23 -VVP_FRONTEND_F003_S005_I000 -p249 -sg35 -VIf an exception (or interrupt, which is in the context of RISC-V systems quite similar) is triggered by the COMMIT, the next PC Gen is assigned to the CSR trap vector base address. The trap vector base address can be different depending on whether the exception traps to S-Mode or M-Mode (user mode exceptions are currently not supported) -p250 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Exception -p251 -sg39 -VSet two different addresses for machine and supervisor handlers in CSR registers. Use a test which executes in machine mode and generates a machine exception by UVM. Check by assertion that when machine exception occurs the machine address is fetched. Functional cov: exception occurs in machine mode. -p252 -sg41 -g42 -sg43 -I4 -sg44 -I0 -sg45 -I1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp253 -sg15 -(lp254 -sg52 -(lp255 -sg13 -(dp256 -g125 -I0 -ssbtp257 -a(V001 -p258 -g1 -(g29 -g3 -Ntp259 -Rp260 -(dp261 -g8 -V001 -p262 -sg23 -VVP_FRONTEND_F003_S005_I001 -p263 -sg35 -VIf an exception (or interrupt, which is in the context of RISC-V systems quite similar) is triggered by the COMMIT, the next PC Gen is assigned to the CSR trap vector base address. The trap vector base address can be different depending on whether the exception traps to S-Mode or M-Mode (user mode exceptions are currently not supported) -p264 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Exception -p265 -sg39 -VSet two different addresses for machine and supervisor handlers in CSR registers. Use a test which executes in supervisor mode and generates a supervisor exception by UVM. Check by assertion that when supervisor exception occurs the supervisor address is fetched. functional cov: exception occurs in supervisor mode. -p266 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp267 -sg15 -(lp268 -sg52 -(lp269 -sg13 -(dp270 -g125 -I0 -ssbtp271 -asg85 -(lp272 -sg52 -(lp273 -sg13 -(dp274 -sbtp275 -a(V006_Pipeline flush -p276 -g1 -(g18 -g3 -Ntp277 -Rp278 -(dp279 -g22 -I2 -sg8 -g276 -sg23 -VVP_IP003_P006 -p280 -sg25 -(dp281 -sg12 -I6 -sg15 -(lp282 -(V000 -p283 -g1 -(g29 -g3 -Ntp284 -Rp285 -(dp286 -g8 -V000 -p287 -sg23 -VVP_FRONTEND_F003_S006_I000 -p288 -sg35 -VFRONTEND starts fetching from the next instruction again in order to take the up-dated information into account -p289 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Pipeline flush -p290 -sg39 -V[no need to verify this point] -p291 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp292 -sg15 -(lp293 -sg52 -(lp294 -sg13 -(dp295 -g125 -I0 -ssbtp296 -asg85 -(lp297 -sg52 -(lp298 -sg13 -(dp299 -sbtp300 -a(V007_Debug -p301 -g1 -(g18 -g3 -Ntp302 -Rp303 -(dp304 -g22 -I1 -sg8 -g301 -sg23 -VVP_IP003_P007 -p305 -sg25 -(dp306 -sg12 -I7 -sg15 -(lp307 -(V000 -p308 -g1 -(g29 -g3 -Ntp309 -Rp310 -(dp311 -g8 -V000 -p312 -sg23 -VVP_FRONTEND_F003_S007_I000 -p313 -sg35 -VThe debug jump is requested by CSR. The address to be jumped into is HW coded. -p314 -sg37 -VFRONTEND sub-system/functionality/PC generation stage/Debug -p315 -sg39 -VUVM generates a debug request to jump into debug handler. Check by assertion that the HW coded debug address is fetched. Functional cov: debug mode occurs -p316 -sg41 -g42 -sg43 -I4 -sg44 -I0 -sg45 -I1 -sg46 -I32 -sg47 -g42 -sg48 -g42 -sg49 -(lp317 -sg15 -(lp318 -sg52 -(lp319 -sg13 -(dp320 -g125 -I0 -ssbtp321 -asg85 -(lp322 -sg52 -(lp323 -sg13 -(dp324 -sbtp325 -a(V008_Address mapping change -p326 -g1 -(g18 -g3 -Ntp327 -Rp328 -(dp329 -g22 -I1 -sg8 -g326 -sg23 -VVP_IP003_P008 -p330 -sg25 -(dp331 -sg12 -I8 -sg15 -(lp332 -(V000 -p333 -g1 -(g29 -g3 -Ntp334 -Rp335 -(dp336 -g8 -V000 -p337 -sg23 -VVP_FRONTEND_F003_S008_I000 -p338 -sg35 -VAll program counters are logical addressed. If the logical to physical mapping changes a fence.vm instruction should used to flush the pipeline and TLBs -p339 -sg37 -VFRONTEND sub-system/functionality/PC generation stage -p340 -sg39 -VExecute a address mapping change, then execute a fence.vm instruction, and continue the execution. -p341 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp342 -sg15 -(lp343 -sg52 -(lp344 -sg13 -(dp345 -g125 -I0 -ssbtp346 -asg85 -(lp347 -sg52 -(lp348 -sg13 -(dp349 -sbtp350 -a(V009_Pc gen priority -p351 -g1 -(g18 -g3 -Ntp352 -Rp353 -(dp354 -g22 -I3 -sg8 -g351 -sg23 -VVP_IP003_P009 -p355 -sg25 -(dp356 -sg12 -I9 -sg15 -(lp357 -(V000 -p358 -g1 -(g29 -g3 -Ntp359 -Rp360 -(dp361 -g8 -V000 -p362 -sg23 -VVP_FRONTEND_F003_S009_I000 -p363 -sg35 -VThe next PC can originate from the following sources (listed in order of precedence) -p364 -sg37 -VFRONTEND sub-system/functionality/PC generation stage -p365 -sg39 -VUse arc_test executing return from env call and generate Exceptions by UVM during reset, Branch predict, default, mispredict, replay and return from env call. Functional cov: monitor the 6 events -p366 -sg41 -g42 -sg43 -I3 -sg44 -I0 -sg45 -I1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp367 -sg15 -(lp368 -sg52 -(lp369 -sg13 -(dp370 -g125 -I0 -ssbtp371 -a(V002 -p372 -g1 -(g29 -g3 -Ntp373 -Rp374 -(dp375 -g8 -V002 -p376 -sg23 -VVP_FRONTEND_F003_S009_I002 -p377 -sg35 -VThe next PC can originate from the following sources (listed in order of precedence) -p378 -sg37 -VFRONTEND sub-system/functionality/PC generation stage -p379 -sg39 -V[other cases to be elaborated] -p380 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp381 -sg15 -(lp382 -sg52 -(lp383 -sg13 -(dp384 -g125 -I0 -ssbtp385 -asg85 -(lp386 -sg52 -(lp387 -sg13 -(dp388 -sbtp389 -asVrfu_list_0 -p390 -(lp391 -sg85 -(lp392 -sVvptool_gitrev -p393 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p394 -sVio_fmt_gitrev -p395 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p396 -sVconfig_gitrev -p397 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p398 -sVymlcfg_gitrev -p399 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p400 -sbtp401 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP003.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP003.yml new file mode 100644 index 000000000..83439bc39 --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP003.yml @@ -0,0 +1,422 @@ +!Feature +next_elt_id: 10 +name: PC generation stage +id: 3 +display_order: 3 +subfeatures: !!omap +- 001_BTB: !Subfeature + name: 001_BTB + tag: VP_IP003_P001 + next_elt_id: 6 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S001_I000 + description: If instruction is a JALR and BTB (Branch Target Buffer) returns + a valid address, next PC is predicted by BTB. Else JALR is not considered + as a control flow instruction, which will generate a mispredict. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a JALR instruction with a valid address in BTB which + is not a misprediction. Check that instruction queue is not flushed. + pfc: 4 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F003_S001_I001 + description: If instruction is a JALR and BTB (Branch Target Buffer) returns + a valid address, next PC is predicted by BTB. Else JALR is not considered + as a control flow instruction, which will generate a mispredict. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a JALR instruction with a valid address in BTB which + is a misprediction. + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_FRONTEND_F003_S001_I002 + description: "If instruction is a JALR and BTB (Branch Target Buffer) returns\ + \ a valid address, next PC is predicted by BTB.\n\nElse JALR is not considered\ + \ as a control flow instruction, which will generate a mispredict." + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Execute test with JALR instructions. Functional cov: JALR is + executed and BTB output is not valid.' + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 8 + coverage_loc: '' + comments: '' +- 002_BHT: !Subfeature + name: 002_BHT + tag: VP_IP003_P002 + next_elt_id: 4 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S002_I000 + description: If instruction is a branch and BTH (Branch History table) returns + a valid address, next PC is predicted by BHT. Else branch is not considered + as an control flow instruction, which will generate a mispredict when branch + is taken. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a BRANCH instruction with a valid address in BHT which + is not a misprediction. Check that instruction queue is not flushed. + pfc: 4 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F003_S002_I001 + description: If instruction is a branch and BTH (Branch History table) returns + a valid address, next PC is predicted by BHT. Else branch is not considered + as an control flow instruction, which will generate a mispredict when branch + is taken. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a BRANCH instruction with a valid address in BHT which + is a misprediction. + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_FRONTEND_F003_S002_I002 + description: If instruction is a branch and BTH (Branch History table) returns + a valid address, next PC is predicted by BHT. Else branch is not considered + as an control flow instruction, which will generate a mispredict when branch + is taken. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Execute test with BRANCH instructions. Functional cov: a BRANCH + is executed, BTB output is not valid and the branch is taken.' + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 8 + coverage_loc: '' + comments: '' +- 003_RAS: !Subfeature + name: 003_RAS + tag: VP_IP003_P003 + next_elt_id: 4 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S003_I000 + description: If instruction is a RET and RAS (Return Address Stack) returns + a valid address and RET has already been consummed by instruction queue. + Else RET is considered as a control flow instruction but next PC is not + predicted. A mispredict wil be generated. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a RET instruction with a valid address in RAS. Check + that instruction queue is not flushed. + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F003_S003_I001 + description: If instruction is a RET and RAS (Return Address Stack) returns + a valid address and RET has already been consummed by instruction queue. + Else RET is considered as a control flow instruction but next PC is not + predicted. A mispredict wil be generated. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a RET instruction with a valid address in RAS which is + a misprediction. + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_FRONTEND_F003_S003_I002 + description: If instruction is a RET and RAS (Return Address Stack) returns + a valid address and RET has already been consummed by instruction queue. + Else RET is considered as a control flow instruction but next PC is not + predicted. A mispredict wil be generated. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Branch Predict + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Execute test with RET instructions. Functional cov: RET is executed + and RAS output is not valid.' + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 8 + coverage_loc: '' + comments: '' +- 004_Return from environment call: !Subfeature + name: 004_Return from environment call + tag: VP_IP003_P004 + next_elt_id: 2 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S004_I000 + description: When CSR asks a return from an environment call, the PC is assigned + to the successive PC to the one stored in the CSR [m-s]epc register. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Return from + env call + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Set two different addresses for mepc and sepc in CSR registers.\ + \ Use a arc_test returning from machine env call.\n\n* Check by assertion\ + \ that when machine return occurs the mepc address is fetched.\n* Functional\ + \ cov: execute a machine return." + pfc: 4 + test_type: 0 + cov_method: 1 + cores: 8 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F003_S004_I001 + description: When CSR asks a return from an environment call, the PC is assigned + to the successive PC to the one stored in the CSR [m-s]epc register. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Return from + env call + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Set two different addresses for mepc and sepc in CSR registers.\ + \ Use a returning from supervisor env call.\n\n* Check by assertion that\ + \ when supervisor return occurs the sepc address is fetched.\n* Functional\ + \ cov: execute a supervisor return." + pfc: 4 + test_type: 0 + cov_method: 1 + cores: 24 + coverage_loc: '' + comments: '' +- 005_Exception/Interrupt: !Subfeature + name: 005_Exception/Interrupt + tag: VP_IP003_P005 + next_elt_id: 2 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S005_I000 + description: If an exception (or interrupt, which is in the context of RISC-V + systems quite similar) is triggered by the COMMIT, the next PC Gen is assigned + to the CSR trap vector base address. The trap vector base address can be + different depending on whether the exception traps to S-Mode or M-Mode (user + mode exceptions are currently not supported) + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Exception + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Set two different addresses for machine and supervisor handlers + in CSR registers. Use a test which executes in machine mode and generates + a machine exception by UVM. Check by assertion that when machine exception + occurs the machine address is fetched. Functional cov: exception occurs + in machine mode.' + pfc: 4 + test_type: 0 + cov_method: 1 + cores: 8 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F003_S005_I001 + description: If an exception (or interrupt, which is in the context of RISC-V + systems quite similar) is triggered by the COMMIT, the next PC Gen is assigned + to the CSR trap vector base address. The trap vector base address can be + different depending on whether the exception traps to S-Mode or M-Mode (user + mode exceptions are currently not supported) + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Exception + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Set two different addresses for machine and supervisor handlers + in CSR registers. Use a test which executes in supervisor mode and generates + a supervisor exception by UVM. Check by assertion that when supervisor exception + occurs the supervisor address is fetched. functional cov: exception occurs + in supervisor mode.' + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 16 + coverage_loc: '' + comments: '' +- 006_Pipeline flush: !Subfeature + name: 006_Pipeline flush + tag: VP_IP003_P006 + next_elt_id: 2 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S006_I000 + description: FRONTEND starts fetching from the next instruction again in order + to take the up-dated information into account + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Pipeline flush + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: '[no need to verify this point]' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 8 + coverage_loc: '' + comments: '' +- 007_Debug: !Subfeature + name: 007_Debug + tag: VP_IP003_P007 + next_elt_id: 1 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S007_I000 + description: The debug jump is requested by CSR. The address to be jumped + into is HW coded. + reqt_doc: FRONTEND sub-system/functionality/PC generation stage/Debug + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'UVM generates a debug request to jump into debug handler. Check + by assertion that the HW coded debug address is fetched. Functional cov: + debug mode occurs' + pfc: 4 + test_type: 0 + cov_method: 1 + cores: 32 + coverage_loc: '' + comments: '' +- 008_Address mapping change: !Subfeature + name: 008_Address mapping change + tag: VP_IP003_P008 + next_elt_id: 1 + display_order: 8 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S008_I000 + description: All program counters are logical addressed. If the logical to + physical mapping changes a fence.vm instruction should used to flush the + pipeline and TLBs + reqt_doc: FRONTEND sub-system/functionality/PC generation stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a address mapping change, then execute a fence.vm instruction, + and continue the execution. + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 009_Pc gen priority: !Subfeature + name: 009_Pc gen priority + tag: VP_IP003_P009 + next_elt_id: 3 + display_order: 9 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F003_S009_I000 + description: The next PC can originate from the following sources (listed + in order of precedence) + reqt_doc: FRONTEND sub-system/functionality/PC generation stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Use arc_test executing return from env call and generate Exceptions + by UVM during reset, Branch predict, default, mispredict, replay and return + from env call. Functional cov: monitor the 6 events' + pfc: 3 + test_type: 0 + cov_method: 1 + cores: 8 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_FRONTEND_F003_S009_I002 + description: The next PC can originate from the following sources (listed + in order of precedence) + reqt_doc: FRONTEND sub-system/functionality/PC generation stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: '[other cases to be elaborated]' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 8 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP004.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP004.pck deleted file mode 100644 index 7af6e80e4..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP004.pck +++ /dev/null @@ -1,384 +0,0 @@ -(VBTB -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I4 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I4 -sVwid_order -p12 -I4 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_flush -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP004_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F004_S000_I000 -p34 -sVdescription -p35 -VThe BTB is never flushed. -p36 -sVpurpose -p37 -VFRONTEND sub-system/Architecture and Modules/BTB -p38 -sVverif_goals -p39 -VNA\u000a\u000a[Does it make sense?] -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I-1 -sVtest_type -p44 -I-1 -sVcov_method -p45 -I-1 -sVcores -p46 -I0 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -asVrfu_list_1 -p57 -(lp58 -sg52 -(lp59 -sg13 -(dp60 -sbtp61 -a(V001_table depth -p62 -g1 -(g18 -g3 -Ntp63 -Rp64 -(dp65 -g22 -I1 -sg8 -g62 -sg23 -VVP_IP004_P001 -p66 -sg25 -(dp67 -sg12 -I1 -sg15 -(lp68 -(V000 -p69 -g1 -(g29 -g3 -Ntp70 -Rp71 -(dp72 -g8 -V000 -p73 -sg23 -VVP_FRONTEND_F004_S001_I000 -p74 -sg35 -VThe information is stored in a 8 entry table. -p75 -sg37 -VFRONTEND sub-system/Architecture and Modules/BTB -p76 -sg39 -VConfirm that the best configuration for BTB entry number is 8 by monitoring the Coremark performance and silicon footprint, the configuration without BTB is to be challenged too. -p77 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp78 -sg15 -(lp79 -sg52 -(lp80 -sg13 -(dp81 -g55 -I0 -ssbtp82 -asg57 -(lp83 -sg52 -(lp84 -sg13 -(dp85 -sbtp86 -a(V002_Table update -p87 -g1 -(g18 -g3 -Ntp88 -Rp89 -(dp90 -g22 -I1 -sg8 -g87 -sg23 -VVP_IP004_P002 -p91 -sg25 -(dp92 -sg12 -I2 -sg15 -(lp93 -(V000 -p94 -g1 -(g29 -g3 -Ntp95 -Rp96 -(dp97 -g8 -V000 -p98 -sg23 -VVP_FRONTEND_F004_S002_I000 -p99 -sg35 -VWhen a unconditional jumps to a register (JALR instruction) is mispredicted by the EXECUTE, the relative information is stored into the BTB, that is to say the JALR PC and the target address. -p100 -sg37 -VFRONTEND sub-system/Architecture and Modules/BTB -p101 -sg39 -VWhen a mis predict occurs caused by JALR, check that info is stored in BTB -p102 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp103 -sg15 -(lp104 -sg52 -(lp105 -sg13 -(dp106 -g55 -I0 -ssbtp107 -asg57 -(lp108 -sg52 -(lp109 -sg13 -(dp110 -sbtp111 -a(V003_debug is not intrusive -p112 -g1 -(g18 -g3 -Ntp113 -Rp114 -(dp115 -g22 -I1 -sg8 -g112 -sg23 -VVP_IP004_P003 -p116 -sg25 -(dp117 -sg12 -I3 -sg15 -(lp118 -(V000 -p119 -g1 -(g29 -g3 -Ntp120 -Rp121 -(dp122 -g8 -V000 -p123 -sg23 -VVP_FRONTEND_F004_S003_I000 -p124 -sg35 -VThe BTB is not updated if processor is in debug mode. -p125 -sg37 -VFRONTEND sub-system/Architecture and Modules/BTB -p126 -sg39 -VExecute a debug session, check that the table content is not modified -p127 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I32 -sg47 -g42 -sg48 -g42 -sg49 -(lp128 -sg15 -(lp129 -sg52 -(lp130 -sg13 -(dp131 -g55 -I0 -ssbtp132 -asg57 -(lp133 -sg52 -(lp134 -sg13 -(dp135 -sbtp136 -asVrfu_list_0 -p137 -(lp138 -sg57 -(lp139 -sVvptool_gitrev -p140 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p141 -sVio_fmt_gitrev -p142 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p143 -sVconfig_gitrev -p144 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p145 -sVymlcfg_gitrev -p146 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p147 -sbtp148 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP004.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP004.yml new file mode 100644 index 000000000..9b39ea709 --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP004.yml @@ -0,0 +1,104 @@ +!Feature +next_elt_id: 4 +name: BTB +id: 4 +display_order: 4 +subfeatures: !!omap +- 000_flush: !Subfeature + name: 000_flush + tag: VP_IP004_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F004_S000_I000 + description: The BTB is never flushed. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BTB + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "NA\n\n[Does it make sense?]" + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 0 + coverage_loc: '' + comments: '' +- 001_table depth: !Subfeature + name: 001_table depth + tag: VP_IP004_P001 + next_elt_id: 1 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F004_S001_I000 + description: The information is stored in a 8 entry table. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BTB + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Confirm that the best configuration for BTB entry number is 8 + by monitoring the Coremark performance and silicon footprint, the configuration + without BTB is to be challenged too. + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 002_Table update: !Subfeature + name: 002_Table update + tag: VP_IP004_P002 + next_elt_id: 1 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F004_S002_I000 + description: When a unconditional jumps to a register (JALR instruction) is + mispredicted by the EXECUTE, the relative information is stored into the + BTB, that is to say the JALR PC and the target address. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BTB + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: When a mis predict occurs caused by JALR, check that info is + stored in BTB + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 003_debug is not intrusive: !Subfeature + name: 003_debug is not intrusive + tag: VP_IP004_P003 + next_elt_id: 1 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F004_S003_I000 + description: The BTB is not updated if processor is in debug mode. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BTB + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a debug session, check that the table content is not + modified + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 32 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP005.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP005.pck deleted file mode 100644 index 56b70c2b1..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP005.pck +++ /dev/null @@ -1,508 +0,0 @@ -(VBHT -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I6 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I5 -sVwid_order -p12 -I5 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_flush -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP005_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F005_S000_I000 -p34 -sVdescription -p35 -VThe BTB is never flushed. -p36 -sVpurpose -p37 -VFRONTEND sub-system/Architecture and Modules/BHT -p38 -sVverif_goals -p39 -VNA\u000a\u000a[Does it make sense?] -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I-1 -sVtest_type -p44 -I-1 -sVcov_method -p45 -I-1 -sVcores -p46 -I0 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -asVrfu_list_1 -p57 -(lp58 -sg52 -(lp59 -sg13 -(dp60 -sbtp61 -a(V002_table update -p62 -g1 -(g18 -g3 -Ntp63 -Rp64 -(dp65 -g22 -I1 -sg8 -g62 -sg23 -VVP_IP005_P002 -p66 -sg25 -(dp67 -sg12 -I2 -sg15 -(lp68 -(V000 -p69 -g1 -(g29 -g3 -Ntp70 -Rp71 -(dp72 -g8 -V000 -p73 -sg23 -VVP_FRONTEND_F005_S002_I000 -p74 -sg35 -VWhen a branch instruction is resolved by the EXECUTE, the relative information is stored in the Branch History Table. -p75 -sg37 -VFRONTEND sub-system/Architecture and Modules/BHT -p76 -sg39 -VWhen a mis predict occurs caused by BRANCH, check that info is stored in BHT -p77 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp78 -sg15 -(lp79 -sg52 -(lp80 -sg13 -(dp81 -g55 -I0 -ssbtp82 -asg57 -(lp83 -sg52 -(lp84 -sg13 -(dp85 -sbtp86 -a(V003_saturation -p87 -g1 -(g18 -g3 -Ntp88 -Rp89 -(dp90 -g22 -I2 -sg8 -g87 -sg23 -VVP_IP005_P003 -p91 -sg25 -(dp92 -sg12 -I3 -sg15 -(lp93 -(V000 -p94 -g1 -(g29 -g3 -Ntp95 -Rp96 -(dp97 -g8 -V000 -p98 -sg23 -VVP_FRONTEND_F005_S003_I000 -p99 -sg35 -VThe Branch History table is a two-bit saturation counter that takes the virtual address of the current fetched instruction by the CACHE. It states whether the current branch request should be taken or not. The two bit counter is updated by the successive execution of the current instructions as shown in the following figure. -p100 -sg37 -VFRONTEND sub-system/Architecture and Modules/BHT -p101 -sg39 -VExecute a serie of taken and not taken branch to check the saturation mechanism -p102 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I-1 -sg47 -g42 -sg48 -g42 -sg49 -(lp103 -sg15 -(lp104 -sg52 -(lp105 -sg13 -(dp106 -g55 -I0 -ssbtp107 -a(V001 -p108 -g1 -(g29 -g3 -Ntp109 -Rp110 -(dp111 -g8 -V001 -p112 -sg23 -VVP_FRONTEND_F005_S003_I001 -p113 -sg35 -VThe Branch History table is a two-bit saturation counter that takes the virtual address of the current fetched instruction by the CACHE. It states whether the current branch request should be taken or not. The two bit counter is updated by the successive execution of the current instructions as shown in the following figure. -p114 -sg37 -VFRONTEND sub-system/Architecture and Modules/BHT -p115 -sg39 -VVerify the saturation mechnism is optimal. Modify the saturation mechanism by removing/adding one stage, and check the Coremark performance evolution -p116 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp117 -sg15 -(lp118 -sg52 -(lp119 -sg13 -(dp120 -g55 -I0 -ssbtp121 -asg57 -(lp122 -sg52 -(lp123 -sg13 -(dp124 -sbtp125 -a(V004_Table depth -p126 -g1 -(g18 -g3 -Ntp127 -Rp128 -(dp129 -g22 -I1 -sg8 -g126 -sg23 -VVP_IP005_P004 -p130 -sg25 -(dp131 -sg12 -I4 -sg15 -(lp132 -(V000 -p133 -g1 -(g29 -g3 -Ntp134 -Rp135 -(dp136 -g8 -V000 -p137 -sg23 -VVP_FRONTEND_F005_S004_I000 -p138 -sg35 -VThe information is stored in a 1024 entry table. -p139 -sg37 -VFRONTEND sub-system/Architecture and Modules/BHT -p140 -sg39 -VConfirm that the best configuration for BHT entry number is 1024 by monitoring the Coremark performance and silicon footprint, the configuration without BHT is to be challenged too. -p141 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp142 -sg15 -(lp143 -sg52 -(lp144 -sg13 -(dp145 -g55 -I0 -ssbtp146 -asg57 -(lp147 -sg52 -(lp148 -sg13 -(dp149 -sbtp150 -a(V005_Debug is not intrusive -p151 -g1 -(g18 -g3 -Ntp152 -Rp153 -(dp154 -g22 -I1 -sg8 -g151 -sg23 -VVP_IP005_P005 -p155 -sg25 -(dp156 -sg12 -I5 -sg15 -(lp157 -(V000 -p158 -g1 -(g29 -g3 -Ntp159 -Rp160 -(dp161 -g8 -V000 -p162 -sg23 -VVP_FRONTEND_F005_S005_I000 -p163 -sg35 -VThe BHT is not updated if processor is in debug mode. -p164 -sg37 -VFRONTEND sub-system/Architecture and Modules/BHT -p165 -sg39 -VExecute a debug session, check that the table content is not modified -p166 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I32 -sg47 -g42 -sg48 -g42 -sg49 -(lp167 -sg15 -(lp168 -sg52 -(lp169 -sg13 -(dp170 -g55 -I0 -ssbtp171 -asg57 -(lp172 -sg52 -(lp173 -sg13 -(dp174 -sbtp175 -asVrfu_list_0 -p176 -(lp177 -sg57 -(lp178 -sVvptool_gitrev -p179 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p180 -sVio_fmt_gitrev -p181 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p182 -sVconfig_gitrev -p183 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p184 -sVymlcfg_gitrev -p185 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p186 -sbtp187 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP005.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP005.yml new file mode 100644 index 000000000..df4babd4d --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP005.yml @@ -0,0 +1,152 @@ +!Feature +next_elt_id: 6 +name: BHT +id: 5 +display_order: 5 +subfeatures: !!omap +- 000_flush: !Subfeature + name: 000_flush + tag: VP_IP005_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F005_S000_I000 + description: The BTB is never flushed. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BHT + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "NA\n\n[Does it make sense?]" + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 0 + coverage_loc: '' + comments: '' +- 002_table update: !Subfeature + name: 002_table update + tag: VP_IP005_P002 + next_elt_id: 1 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F005_S002_I000 + description: When a branch instruction is resolved by the EXECUTE, the relative + information is stored in the Branch History Table. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BHT + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: When a mis predict occurs caused by BRANCH, check that info is + stored in BHT + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 003_saturation: !Subfeature + name: 003_saturation + tag: VP_IP005_P003 + next_elt_id: 2 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F005_S003_I000 + description: The Branch History table is a two-bit saturation counter that + takes the virtual address of the current fetched instruction by the CACHE. + It states whether the current branch request should be taken or not. The + two bit counter is updated by the successive execution of the current instructions + as shown in the following figure. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BHT + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a serie of taken and not taken branch to check the saturation + mechanism + pfc: -1 + test_type: -1 + cov_method: -1 + cores: -1 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F005_S003_I001 + description: The Branch History table is a two-bit saturation counter that + takes the virtual address of the current fetched instruction by the CACHE. + It states whether the current branch request should be taken or not. The + two bit counter is updated by the successive execution of the current instructions + as shown in the following figure. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BHT + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Verify the saturation mechnism is optimal. Modify the saturation + mechanism by removing/adding one stage, and check the Coremark performance + evolution + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 004_Table depth: !Subfeature + name: 004_Table depth + tag: VP_IP005_P004 + next_elt_id: 1 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F005_S004_I000 + description: The information is stored in a 1024 entry table. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BHT + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Confirm that the best configuration for BHT entry number is 1024 + by monitoring the Coremark performance and silicon footprint, the configuration + without BHT is to be challenged too. + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 005_Debug is not intrusive: !Subfeature + name: 005_Debug is not intrusive + tag: VP_IP005_P005 + next_elt_id: 1 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F005_S005_I000 + description: The BHT is not updated if processor is in debug mode. + reqt_doc: FRONTEND sub-system/Architecture and Modules/BHT + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a debug session, check that the table content is not + modified + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 32 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP006.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP006.pck deleted file mode 100644 index 2fdde8008..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP006.pck +++ /dev/null @@ -1,384 +0,0 @@ -(VRAS -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I4 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I6 -sVwid_order -p12 -I6 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_flush -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP006_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F006_S000_I000 -p34 -sVdescription -p35 -VThe RAS is never flushed. -p36 -sVpurpose -p37 -VFRONTEND sub-system/Architecture and Modules/RAS -p38 -sVverif_goals -p39 -VNA\u000a\u000a[Does it make sense?] -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I-1 -sVtest_type -p44 -I-1 -sVcov_method -p45 -I-1 -sVcores -p46 -I0 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -asVrfu_list_1 -p57 -(lp58 -sg52 -(lp59 -sg13 -(dp60 -sbtp61 -a(V001_table depth -p62 -g1 -(g18 -g3 -Ntp63 -Rp64 -(dp65 -g22 -I1 -sg8 -g62 -sg23 -VVP_IP006_P001 -p66 -sg25 -(dp67 -sg12 -I1 -sg15 -(lp68 -(V000 -p69 -g1 -(g29 -g3 -Ntp70 -Rp71 -(dp72 -g8 -V000 -p73 -sg23 -VVP_FRONTEND_F006_S001_I000 -p74 -sg35 -VThe RAS FIFO depth is 2. -p75 -sg37 -VFRONTEND sub-system/Architecture and Modules/RAS -p76 -sg39 -VConfirm that the best configuration for RAS entry number is 2 by monitoring the Coremark performance and silicon footprint, the configuration without RAS is to be challenged too. -p77 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp78 -sg15 -(lp79 -sg52 -(lp80 -sg13 -(dp81 -g55 -I0 -ssbtp82 -asg57 -(lp83 -sg52 -(lp84 -sg13 -(dp85 -sbtp86 -a(V002_Table update -p87 -g1 -(g18 -g3 -Ntp88 -Rp89 -(dp90 -g22 -I1 -sg8 -g87 -sg23 -VVP_IP006_P002 -p91 -sg25 -(dp92 -sg12 -I2 -sg15 -(lp93 -(V000 -p94 -g1 -(g29 -g3 -Ntp95 -Rp96 -(dp97 -g8 -V000 -p98 -sg23 -VVP_FRONTEND_F006_S002_I000 -p99 -sg35 -VWhen an unconditional jumps to a known target address (JAL instruction) is consummed by the instr_queue, the next pc after the JAL instruction and the return address are stored into a FIFO. -p100 -sg37 -VFRONTEND sub-system/Architecture and Modules/RAS -p101 -sg39 -VWhen a JAL instruction is executed, check that info is stored in RAS -p102 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp103 -sg15 -(lp104 -sg52 -(lp105 -sg13 -(dp106 -g55 -I0 -ssbtp107 -asg57 -(lp108 -sg52 -(lp109 -sg13 -(dp110 -sbtp111 -a(V003_Debug is not intrusive -p112 -g1 -(g18 -g3 -Ntp113 -Rp114 -(dp115 -g22 -I1 -sg8 -g112 -sg23 -VVP_IP006_P003 -p116 -sg25 -(dp117 -sg12 -I3 -sg15 -(lp118 -(V000 -p119 -g1 -(g29 -g3 -Ntp120 -Rp121 -(dp122 -g8 -V000 -p123 -sg23 -VVP_FRONTEND_F006_S003_I000 -p124 -sg35 -VNo dedicated specification -p125 -sg37 -VFRONTEND sub-system/Architecture and Modules/RAS -p126 -sg39 -VExecute a debug session, check that the table content is not modified -p127 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I32 -sg47 -g42 -sg48 -g42 -sg49 -(lp128 -sg15 -(lp129 -sg52 -(lp130 -sg13 -(dp131 -g55 -I0 -ssbtp132 -asg57 -(lp133 -sg52 -(lp134 -sg13 -(dp135 -sbtp136 -asVrfu_list_0 -p137 -(lp138 -sg57 -(lp139 -sVvptool_gitrev -p140 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p141 -sVio_fmt_gitrev -p142 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p143 -sVconfig_gitrev -p144 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p145 -sVymlcfg_gitrev -p146 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p147 -sbtp148 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP006.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP006.yml new file mode 100644 index 000000000..76b06d498 --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP006.yml @@ -0,0 +1,104 @@ +!Feature +next_elt_id: 4 +name: RAS +id: 6 +display_order: 6 +subfeatures: !!omap +- 000_flush: !Subfeature + name: 000_flush + tag: VP_IP006_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F006_S000_I000 + description: The RAS is never flushed. + reqt_doc: FRONTEND sub-system/Architecture and Modules/RAS + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "NA\n\n[Does it make sense?]" + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 0 + coverage_loc: '' + comments: '' +- 001_table depth: !Subfeature + name: 001_table depth + tag: VP_IP006_P001 + next_elt_id: 1 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F006_S001_I000 + description: The RAS FIFO depth is 2. + reqt_doc: FRONTEND sub-system/Architecture and Modules/RAS + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Confirm that the best configuration for RAS entry number is 2 + by monitoring the Coremark performance and silicon footprint, the configuration + without RAS is to be challenged too. + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 002_Table update: !Subfeature + name: 002_Table update + tag: VP_IP006_P002 + next_elt_id: 1 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F006_S002_I000 + description: When an unconditional jumps to a known target address (JAL instruction) + is consummed by the instr_queue, the next pc after the JAL instruction and + the return address are stored into a FIFO. + reqt_doc: FRONTEND sub-system/Architecture and Modules/RAS + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: When a JAL instruction is executed, check that info is stored + in RAS + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 003_Debug is not intrusive: !Subfeature + name: 003_Debug is not intrusive + tag: VP_IP006_P003 + next_elt_id: 1 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F006_S003_I000 + description: No dedicated specification + reqt_doc: FRONTEND sub-system/Architecture and Modules/RAS + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a debug session, check that the table content is not + modified + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 32 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP007.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP007.pck deleted file mode 100644 index 92ea00422..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP007.pck +++ /dev/null @@ -1,232 +0,0 @@ -(VInstr_realign -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I2 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I7 -sVwid_order -p12 -I7 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_C extension -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP007_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F007_S000_I000 -p34 -sVdescription -p35 -VThe 32-bit aligned block coming from the CACHE sub-system enters the instr_realign module. This module extracts the instructions from the 32-bit blocks, up to two instructions because it is possible to fetch two instructions when C extension is used. If the instructions are not compressed, it is possible that the instruction is not aligned on the block size but rather interleaved with two cache blocks. In that case, two cache accesses are needed. The instr_realign module provides at maximum one instruction per cycle. Not complete instruction is stored in instr_realign module before being provided in the next cycles. -p36 -sVpurpose -p37 -VFRONTEND sub-system/Architecture and Modules/Instr_realign -p38 -sVverif_goals -p39 -VExecute program compiled with C extension. Cover the case when 2 instructions are fetched in the same cache block and when an instruction is interleaved with two cache block\u000a\u000a[NO NEED TO VERIFY THIS CASE] -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I-1 -sVtest_type -p44 -I-1 -sVcov_method -p45 -I-1 -sVcores -p46 -I0 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -asVrfu_list_1 -p57 -(lp58 -sg52 -(lp59 -sg13 -(dp60 -sbtp61 -a(V001_Flush -p62 -g1 -(g18 -g3 -Ntp63 -Rp64 -(dp65 -g22 -I1 -sg8 -g62 -sg23 -VVP_IP007_P001 -p66 -sg25 -(dp67 -sg12 -I1 -sg15 -(lp68 -(V000 -p69 -g1 -(g29 -g3 -Ntp70 -Rp71 -(dp72 -g8 -V000 -p73 -sg23 -VVP_FRONTEND_F007_S001_I000 -p74 -sg35 -VIn case of mispredict, flush, replay or branch predict, the instr_realign is re-initialized, the internal register storing the instruction alignment state is reset. -p75 -sg37 -VFRONTEND sub-system/Architecture and Modules/Instr_realign -p76 -sg39 -V[NO NEED TO VERIFY THIS CASE] -p77 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I0 -sg47 -g42 -sg48 -g42 -sg49 -(lp78 -sg15 -(lp79 -sg52 -(lp80 -sg13 -(dp81 -g55 -I0 -ssbtp82 -asg57 -(lp83 -sg52 -(lp84 -sg13 -(dp85 -sbtp86 -asVrfu_list_0 -p87 -(lp88 -sg57 -(lp89 -sVvptool_gitrev -p90 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p91 -sVio_fmt_gitrev -p92 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p93 -sVconfig_gitrev -p94 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p95 -sVymlcfg_gitrev -p96 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p97 -sbtp98 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP007.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP007.yml new file mode 100644 index 000000000..365f818e3 --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP007.yml @@ -0,0 +1,66 @@ +!Feature +next_elt_id: 2 +name: Instr_realign +id: 7 +display_order: 7 +subfeatures: !!omap +- 000_C extension: !Subfeature + name: 000_C extension + tag: VP_IP007_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F007_S000_I000 + description: The 32-bit aligned block coming from the CACHE sub-system enters + the instr_realign module. This module extracts the instructions from the + 32-bit blocks, up to two instructions because it is possible to fetch two + instructions when C extension is used. If the instructions are not compressed, + it is possible that the instruction is not aligned on the block size but + rather interleaved with two cache blocks. In that case, two cache accesses + are needed. The instr_realign module provides at maximum one instruction + per cycle. Not complete instruction is stored in instr_realign module before + being provided in the next cycles. + reqt_doc: FRONTEND sub-system/Architecture and Modules/Instr_realign + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Execute program compiled with C extension. Cover the case when\ + \ 2 instructions are fetched in the same cache block and when an instruction\ + \ is interleaved with two cache block\n\n[NO NEED TO VERIFY THIS CASE]" + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 0 + coverage_loc: '' + comments: '' +- 001_Flush: !Subfeature + name: 001_Flush + tag: VP_IP007_P001 + next_elt_id: 1 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F007_S001_I000 + description: In case of mispredict, flush, replay or branch predict, the instr_realign + is re-initialized, the internal register storing the instruction alignment + state is reset. + reqt_doc: FRONTEND sub-system/Architecture and Modules/Instr_realign + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: '[NO NEED TO VERIFY THIS CASE]' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 0 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP008.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP008.pck deleted file mode 100644 index dc4ea8eef..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP008.pck +++ /dev/null @@ -1,308 +0,0 @@ -(VInstr_queue -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I3 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I8 -sVwid_order -p12 -I8 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_FIFO depth -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP008_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F008_S000_I000 -p34 -sVdescription -p35 -VThe instruction queue contains max 4 instructions. -p36 -sVpurpose -p37 -VFRONTEND sub-system/Architecture and Modules/Instr_queue -p38 -sVverif_goals -p39 -VConfirm that the best configuration for instruction queue entry number is 4 by monitoring the Coremark performance and silicon footprint -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I11 -sVtest_type -p44 -I10 -sVcov_method -p45 -I10 -sVcores -p46 -I8 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -asVrfu_list_1 -p57 -(lp58 -sg52 -(lp59 -sg13 -(dp60 -sbtp61 -a(V001_Page fault exception -p62 -g1 -(g18 -g3 -Ntp63 -Rp64 -(dp65 -g22 -I1 -sg8 -g62 -sg23 -VVP_IP008_P001 -p66 -sg25 -(dp67 -sg12 -I1 -sg15 -(lp68 -(V000 -p69 -g1 -(g29 -g3 -Ntp70 -Rp71 -(dp72 -g8 -V000 -p73 -sg23 -VVP_FRONTEND_F008_S001_I000 -p74 -sg35 -VIn instruction queue, exception can only correspond to page-fault exception. -p75 -sg37 -VFRONTEND sub-system/Architecture and Modules/Instr_queue -p76 -sg39 -VExecute following exception and check that only page-fault can be stored in instruction queue: bus errors, invalid accesses or instruction page faults. -p77 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp78 -sg15 -(lp79 -sg52 -(lp80 -sg13 -(dp81 -g55 -I0 -ssbtp82 -asg57 -(lp83 -sg52 -(lp84 -sg13 -(dp85 -sbtp86 -a(V002_Flush -p87 -g1 -(g18 -g3 -Ntp88 -Rp89 -(dp90 -g22 -I1 -sg8 -g87 -sg23 -VVP_IP008_P002 -p91 -sg25 -(dp92 -sg12 -I2 -sg15 -(lp93 -(V000 -p94 -g1 -(g29 -g3 -Ntp95 -Rp96 -(dp97 -g8 -V000 -p98 -sg23 -VVP_FRONTEND_F008_S002_I000 -p99 -sg35 -VThe instruction queue can be flushed by CONTROLLER. -p100 -sg37 -VFRONTEND sub-system/Architecture and Modules/Instr_queue -p101 -sg39 -V[NO NEED TO VERIFY THIS CASE] -p102 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I0 -sg47 -g42 -sg48 -g42 -sg49 -(lp103 -sg15 -(lp104 -sg52 -(lp105 -sg13 -(dp106 -g55 -I0 -ssbtp107 -asg57 -(lp108 -sg52 -(lp109 -sg13 -(dp110 -sbtp111 -asVrfu_list_0 -p112 -(lp113 -sg57 -(lp114 -sVvptool_gitrev -p115 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p116 -sVio_fmt_gitrev -p117 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p118 -sVconfig_gitrev -p119 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p120 -sVymlcfg_gitrev -p121 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p122 -sbtp123 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP008.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP008.yml new file mode 100644 index 000000000..0559c2d9d --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP008.yml @@ -0,0 +1,80 @@ +!Feature +next_elt_id: 3 +name: Instr_queue +id: 8 +display_order: 8 +subfeatures: !!omap +- 000_FIFO depth: !Subfeature + name: 000_FIFO depth + tag: VP_IP008_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F008_S000_I000 + description: The instruction queue contains max 4 instructions. + reqt_doc: FRONTEND sub-system/Architecture and Modules/Instr_queue + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Confirm that the best configuration for instruction queue entry + number is 4 by monitoring the Coremark performance and silicon footprint + pfc: 11 + test_type: 10 + cov_method: 10 + cores: 8 + coverage_loc: '' + comments: '' +- 001_Page fault exception: !Subfeature + name: 001_Page fault exception + tag: VP_IP008_P001 + next_elt_id: 1 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F008_S001_I000 + description: In instruction queue, exception can only correspond to page-fault + exception. + reqt_doc: FRONTEND sub-system/Architecture and Modules/Instr_queue + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Execute following exception and check that only page-fault can + be stored in instruction queue: bus errors, invalid accesses or instruction + page faults.' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 002_Flush: !Subfeature + name: 002_Flush + tag: VP_IP008_P002 + next_elt_id: 1 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F008_S002_I000 + description: The instruction queue can be flushed by CONTROLLER. + reqt_doc: FRONTEND sub-system/Architecture and Modules/Instr_queue + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: '[NO NEED TO VERIFY THIS CASE]' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 0 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP009.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP009.pck deleted file mode 100644 index ac1287a8b..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP009.pck +++ /dev/null @@ -1,59 +0,0 @@ -(VInstr_scan -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I0 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I9 -sVwid_order -p12 -I9 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -sVrfu_list_0 -p17 -(lp18 -sVrfu_list_1 -p19 -(lp20 -sVvptool_gitrev -p21 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p22 -sVio_fmt_gitrev -p23 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p24 -sVconfig_gitrev -p25 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p26 -sVymlcfg_gitrev -p27 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p28 -sbtp29 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP009.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP009.yml new file mode 100644 index 000000000..6ec7a33b7 --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP009.yml @@ -0,0 +1,10 @@ +!Feature +next_elt_id: 0 +name: Instr_scan +id: 9 +display_order: 9 +subfeatures: !!omap [] +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP010.pck b/cva6/docs/VerifPlans/FRONTEND/VP_IP010.pck deleted file mode 100644 index db23b5ab5..000000000 --- a/cva6/docs/VerifPlans/FRONTEND/VP_IP010.pck +++ /dev/null @@ -1,376 +0,0 @@ -(VFetch stage -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I3 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I10 -sVwid_order -p12 -I10 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V001_MMU translation -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I2 -sg8 -g17 -sVtag -p23 -VVP_IP010_P001 -p24 -sVitem_list -p25 -(dp26 -sg12 -I1 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_FRONTEND_F010_S001_I000 -p34 -sVdescription -p35 -VThe Fetch stage asks the MMU to translate the requested address. -p36 -sVpurpose -p37 -VFRONTEND sub-system/functionality/Fetch stage -p38 -sVverif_goals -p39 -VExecute a program with virtual PC -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I-1 -sVtest_type -p44 -I-1 -sVcov_method -p45 -I-1 -sVcores -p46 -I16 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_FRONTEND_F010_S001_I001 -p62 -sg35 -VThe Fetch stage asks the MMU to translate the requested address. -p63 -sg37 -VFRONTEND sub-system/functionality/Fetch stage -p64 -sg39 -VCheck the translation does not impact execution time by executing Coremark in pphysical and virtual modes. -p65 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -asVrfu_list_1 -p71 -(lp72 -sg52 -(lp73 -sg13 -(dp74 -sbtp75 -a(V002_Exceptions -p76 -g1 -(g18 -g3 -Ntp77 -Rp78 -(dp79 -g22 -I4 -sg8 -g76 -sg23 -VVP_IP010_P002 -p80 -sg25 -(dp81 -sg12 -I2 -sg15 -(lp82 -(V000 -p83 -g1 -(g29 -g3 -Ntp84 -Rp85 -(dp86 -g8 -V000 -p87 -sg23 -VVP_FRONTEND_F010_S002_I000 -p88 -sg35 -VMemory and MMU (MMU is not enabled in CV32A6-step1) can feedback potential exceptions generated by the memory fetch request. They can be bus errors, invalid accesses or instruction page faults. -p89 -sg37 -VFRONTEND sub-system/functionality/Fetch stage -p90 -sg39 -VGenerate a bus error exception by UVM or by test (to be decided) and check that the exception address is fetched. Functional cov: a bus error exception occurs. -p91 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp92 -sg15 -(lp93 -sg52 -(lp94 -sg13 -(dp95 -g55 -I0 -ssbtp96 -a(V002 -p97 -g1 -(g29 -g3 -Ntp98 -Rp99 -(dp100 -g8 -V002 -p101 -sg23 -VVP_FRONTEND_F010_S002_I002 -p102 -sg35 -VMemory and MMU (MMU is not enabled in CV32A6-step1) can feedback potential exceptions generated by the memory fetch request. They can be bus errors, invalid accesses or instruction page faults. -p103 -sg37 -VFRONTEND sub-system/functionality/Fetch stage -p104 -sg39 -VGenerate an invalid access exception by UVM or by test (to be decided) and check that the exception address is fetched. Functional cov: an invalid access exception occurs. -p105 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I8 -sg47 -g42 -sg48 -g42 -sg49 -(lp106 -sg15 -(lp107 -sg52 -(lp108 -sg13 -(dp109 -g55 -I0 -ssbtp110 -a(V003 -p111 -g1 -(g29 -g3 -Ntp112 -Rp113 -(dp114 -g8 -V003 -p115 -sg23 -VVP_FRONTEND_F010_S002_I003 -p116 -sg35 -VMemory and MMU (MMU is not enabled in CV32A6-step1) can feedback potential exceptions generated by the memory fetch request. They can be bus errors, invalid accesses or instruction page faults. -p117 -sg37 -VFRONTEND sub-system/functionality/Fetch stage -p118 -sg39 -VGenerate an instruction page faults and check that the exception is triggered -p119 -sg41 -g42 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I16 -sg47 -g42 -sg48 -g42 -sg49 -(lp120 -sg15 -(lp121 -sg52 -(lp122 -sg13 -(dp123 -g55 -I0 -ssbtp124 -asg71 -(lp125 -sg52 -(lp126 -sg13 -(dp127 -sbtp128 -asVrfu_list_0 -p129 -(lp130 -sg71 -(lp131 -sVvptool_gitrev -p132 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p133 -sVio_fmt_gitrev -p134 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p135 -sVconfig_gitrev -p136 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p137 -sVymlcfg_gitrev -p138 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p139 -sbtp140 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/FRONTEND/VP_IP010.yml b/cva6/docs/VerifPlans/FRONTEND/VP_IP010.yml new file mode 100644 index 000000000..fe95149ac --- /dev/null +++ b/cva6/docs/VerifPlans/FRONTEND/VP_IP010.yml @@ -0,0 +1,114 @@ +!Feature +next_elt_id: 3 +name: Fetch stage +id: 10 +display_order: 10 +subfeatures: !!omap +- 001_MMU translation: !Subfeature + name: 001_MMU translation + tag: VP_IP010_P001 + next_elt_id: 2 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F010_S001_I000 + description: The Fetch stage asks the MMU to translate the requested address. + reqt_doc: FRONTEND sub-system/functionality/Fetch stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Execute a program with virtual PC + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_FRONTEND_F010_S001_I001 + description: The Fetch stage asks the MMU to translate the requested address. + reqt_doc: FRONTEND sub-system/functionality/Fetch stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Check the translation does not impact execution time by executing + Coremark in pphysical and virtual modes. + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +- 002_Exceptions: !Subfeature + name: 002_Exceptions + tag: VP_IP010_P002 + next_elt_id: 4 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_FRONTEND_F010_S002_I000 + description: Memory and MMU (MMU is not enabled in CV32A6-step1) can feedback + potential exceptions generated by the memory fetch request. They can be + bus errors, invalid accesses or instruction page faults. + reqt_doc: FRONTEND sub-system/functionality/Fetch stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Generate a bus error exception by UVM or by test (to be decided) + and check that the exception address is fetched. Functional cov: a bus error + exception occurs.' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 8 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_FRONTEND_F010_S002_I002 + description: Memory and MMU (MMU is not enabled in CV32A6-step1) can feedback + potential exceptions generated by the memory fetch request. They can be + bus errors, invalid accesses or instruction page faults. + reqt_doc: FRONTEND sub-system/functionality/Fetch stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: 'Generate an invalid access exception by UVM or by test (to be + decided) and check that the exception address is fetched. Functional cov: + an invalid access exception occurs.' + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 8 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_FRONTEND_F010_S002_I003 + description: Memory and MMU (MMU is not enabled in CV32A6-step1) can feedback + potential exceptions generated by the memory fetch request. They can be + bus errors, invalid accesses or instruction page faults. + reqt_doc: FRONTEND sub-system/functionality/Fetch stage + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Generate an instruction page faults and check that the exception + is triggered + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 16 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' From e03c76bacd37d858b08a04426952e50c7f383c5e Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 13 Feb 2023 11:34:12 +0100 Subject: [PATCH 035/183] DV plans: Switch ISA_RV32 DV plan to Yaml format. * cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml: New. * cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP000.pck: Delete. * cva6/docs/VerifPlans/ISA_RV32/VP_IP001.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP002.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP003.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP004.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP005.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP006.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP007.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP008.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP009.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP010.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP011.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP012.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP013.pck: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP014.pck: Ditto. Signed-off-by: Zbigniew Chamski --- cva6/docs/VerifPlans/ISA_RV32/VP_IP000.pck | 1999 --------------- cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml | 697 ++++++ cva6/docs/VerifPlans/ISA_RV32/VP_IP001.pck | 1828 -------------- cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml | 665 +++++ cva6/docs/VerifPlans/ISA_RV32/VP_IP002.pck | 1478 ----------- cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml | 498 ++++ cva6/docs/VerifPlans/ISA_RV32/VP_IP003.pck | 1333 ---------- cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml | 454 ++++ cva6/docs/VerifPlans/ISA_RV32/VP_IP004.pck | 157 -- cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml | 33 + cva6/docs/VerifPlans/ISA_RV32/VP_IP005.pck | 284 --- cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml | 70 + cva6/docs/VerifPlans/ISA_RV32/VP_IP006.pck | 780 ------ cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml | 275 +++ cva6/docs/VerifPlans/ISA_RV32/VP_IP007.pck | 976 -------- cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml | 350 +++ cva6/docs/VerifPlans/ISA_RV32/VP_IP008.pck | 520 ---- cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml | 179 ++ cva6/docs/VerifPlans/ISA_RV32/VP_IP009.pck | 2059 ---------------- cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml | 788 ++++++ cva6/docs/VerifPlans/ISA_RV32/VP_IP010.pck | 2592 -------------------- cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml | 868 +++++++ cva6/docs/VerifPlans/ISA_RV32/VP_IP011.pck | 920 ------- cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml | 286 +++ cva6/docs/VerifPlans/ISA_RV32/VP_IP012.pck | 672 ----- cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml | 218 ++ cva6/docs/VerifPlans/ISA_RV32/VP_IP013.pck | 824 ------- cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml | 263 ++ cva6/docs/VerifPlans/ISA_RV32/VP_IP014.pck | 157 -- cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml | 32 + 30 files changed, 5676 insertions(+), 16579 deletions(-) delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP000.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP001.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP002.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP003.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP004.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP005.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP006.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP007.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP008.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP009.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP010.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP011.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP012.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP013.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml delete mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP014.pck create mode 100644 cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.pck deleted file mode 100644 index 01fe8aacb..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.pck +++ /dev/null @@ -1,1999 +0,0 @@ -(VRV32I Register-Immediate Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I11 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I0 -sVwid_order -p12 -I0 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_ADDI -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I3 -sg8 -g17 -sVtag -p23 -VVP_IP011_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F011_S000_I000 -p34 -sVdescription -p35 -Vaddi rd, rs1, imm[11:0]\u000ard = rs1 + Sext(imm[11:0])\u000aArithmetic overflow is lost and ignored -p36 -sVpurpose -p37 -VISA\u000aChapter 2.4 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p40 -sVcoverage_loc -p41 -Visacov.rv32i_addi_cg.cp_rs1\u000aisacov.rv32i_addi_cg.cp_rd\u000aisacov.rv32i_addi_cg.cp_rd_rs1_hazard -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -V001 -p62 -sg23 -VVP_ISA_F011_S000_I001 -p63 -sg35 -Vaddi rd, rs1, imm[11:0]\u000ard = rs1 + Sext(imm[11:0])\u000aArithmetic overflow is lost and ignored -p64 -sg37 -VISA\u000aChapter 2.4 -p65 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p66 -sg41 -Visacov.rv32i_addi_cg.cp_rs1_value\u000aisacov.rv32i_addi_cg.cp_immi_value\u000aisacov.rv32i_addi_cg.cross_rs1_immi_value\u000aisacov.rv32i_addi_cg.cp_rs1_toggle\u000aisacov.rv32i_addi_cg.cp_immi_toggle -p67 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp68 -sg15 -(lp69 -sg53 -(lp70 -sg13 -(dp71 -g56 -I0 -ssbtp72 -a(V002 -p73 -g1 -(g29 -g3 -Ntp74 -Rp75 -(dp76 -g8 -V002 -p77 -sg23 -VVP_ISA_F011_S000_I002 -p78 -sg35 -Vaddi rd, rs1, imm[11:0]\u000ard = rs1 + Sext(imm[11:0])\u000aArithmetic overflow is lost and ignored -p79 -sg37 -VISA\u000aChapter 2.4 -p80 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p81 -sg41 -Visacov.rv32i_addi_cg.cp_rd_value\u000aisacov.rv32i_addi_cg.cp_rd_toggle -p82 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp83 -sg15 -(lp84 -sg53 -(lp85 -sg13 -(dp86 -g56 -I0 -ssbtp87 -asVrfu_list_1 -p88 -(lp89 -sg53 -(lp90 -sg13 -(dp91 -sbtp92 -a(V001_XORI -p93 -g1 -(g18 -g3 -Ntp94 -Rp95 -(dp96 -g22 -I5 -sg8 -g93 -sg23 -VVP_IP011_P001 -p97 -sg25 -(dp98 -sg12 -I1 -sg15 -(lp99 -(V000 -p100 -g1 -(g29 -g3 -Ntp101 -Rp102 -(dp103 -g8 -V000 -p104 -sg23 -VVP_ISA_F011_S001_I000 -p105 -sg35 -Vxori rd, rs1, imm[11:0]\u000ard = rs1 ^ Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p106 -sg37 -VISA\u000aChapter 2.4 -p107 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p108 -sg41 -Visacov.rv32i_xori_cg.cp_rs1\u000aisacov.rv32i_xori_cg.cp_rd\u000aisacov.rv32i_xori_cg.cp_rd_rs1_hazard -p109 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp110 -sg15 -(lp111 -sg53 -(lp112 -sg13 -(dp113 -g56 -I0 -ssbtp114 -a(V001 -p115 -g1 -(g29 -g3 -Ntp116 -Rp117 -(dp118 -g8 -g115 -sg23 -VVP_ISA_F011_S001_I001 -p119 -sg35 -Vxori rd, rs1, imm[11:0]\u000ard = rs1 ^ Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p120 -sg37 -VISA\u000aChapter 2.4 -p121 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p122 -sg41 -Visacov.rv32i_xori_cg.cp_rs1_value\u000aisacov.rv32i_xori_cg.cp_immi_value\u000aisacov.rv32i_xori_cg.cross_rs1_immi_value\u000aisacov.rv32i_xori_cg.cp_rs1_toggle\u000aisacov.rv32i_xori_cg.cp_immi_toggle -p123 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp124 -sg15 -(lp125 -sg53 -(lp126 -sg13 -(dp127 -g56 -I0 -ssbtp128 -a(V002 -p129 -g1 -(g29 -g3 -Ntp130 -Rp131 -(dp132 -g8 -g129 -sg23 -VVP_ISA_F011_S001_I002 -p133 -sg35 -Vxori rd, rs1, imm[11:0]\u000ard = rs1 ^ Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p134 -sg37 -VISA\u000aChapter 2.4 -p135 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p136 -sg41 -Visacov.rv32i_xori_cg.cp_rd_value\u000aisacov.rv32i_xori_cg.cp_rd_toggle -p137 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp138 -sg15 -(lp139 -sg53 -(lp140 -sg13 -(dp141 -g56 -I0 -ssbtp142 -asg88 -(lp143 -sg53 -(lp144 -sg13 -(dp145 -sbtp146 -a(V002_ORI -p147 -g1 -(g18 -g3 -Ntp148 -Rp149 -(dp150 -g22 -I4 -sg8 -g147 -sg23 -VVP_IP011_P002 -p151 -sg25 -(dp152 -sg12 -I2 -sg15 -(lp153 -(V000 -p154 -g1 -(g29 -g3 -Ntp155 -Rp156 -(dp157 -g8 -V000 -p158 -sg23 -VVP_ISA_F011_S002_I000 -p159 -sg35 -Vori rd, rs1, imm[11:0]\u000ard = rs1 | Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p160 -sg37 -VISA\u000aChapter 2.4 -p161 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p162 -sg41 -Visacov.rv32i_ori_cg.cp_rs1\u000aisacov.rv32i_ori_cg.cp_rd\u000aisacov.rv32i_ori_cg.cp_rd_rs1_hazard -p163 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp164 -sg15 -(lp165 -sg53 -(lp166 -sg13 -(dp167 -g56 -I0 -ssbtp168 -a(V001 -p169 -g1 -(g29 -g3 -Ntp170 -Rp171 -(dp172 -g8 -g169 -sg23 -VVP_ISA_F011_S002_I001 -p173 -sg35 -Vori rd, rs1, imm[11:0]\u000ard = rs1 | Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p174 -sg37 -VISA\u000aChapter 2.4 -p175 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p176 -sg41 -Visacov.rv32i_ori_cg.cp_rs1_value\u000aisacov.rv32i_ori_cg.cp_immi_value\u000aisacov.rv32i_ori_cg.cross_rs1_immi_value\u000aisacov.rv32i_ori_cg.cp_rs1_toggle\u000aisacov.rv32i_ori_cg.cp_immi_toggle -p177 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp178 -sg15 -(lp179 -sg53 -(lp180 -sg13 -(dp181 -g56 -I0 -ssbtp182 -a(V002 -p183 -g1 -(g29 -g3 -Ntp184 -Rp185 -(dp186 -g8 -g183 -sg23 -VVP_ISA_F011_S002_I002 -p187 -sg35 -Vori rd, rs1, imm[11:0]\u000ard = rs1 | Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p188 -sg37 -VISA\u000aChapter 2.4 -p189 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p190 -sg41 -Visacov.rv32i_ori_cg.cp_rd_value\u000aisacov.rv32i_ori_cg.cp_rd_toggle -p191 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp192 -sg15 -(lp193 -sg53 -(lp194 -sg13 -(dp195 -g56 -I0 -ssbtp196 -asg88 -(lp197 -sg53 -(lp198 -sg13 -(dp199 -sbtp200 -a(V003_ANDI -p201 -g1 -(g18 -g3 -Ntp202 -Rp203 -(dp204 -g22 -I3 -sg8 -g201 -sg23 -VVP_IP011_P003 -p205 -sg25 -(dp206 -sg12 -I3 -sg15 -(lp207 -(V000 -p208 -g1 -(g29 -g3 -Ntp209 -Rp210 -(dp211 -g8 -V000 -p212 -sg23 -VVP_ISA_F011_S003_I000 -p213 -sg35 -Vandi rd, rs1, imm[11:0]\u000ard = rs1 & Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p214 -sg37 -VISA\u000aChapter 2.4 -p215 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p216 -sg41 -Visacov.rv32i_andi_cg.cp_rs1\u000aisacov.rv32i_andi_cg.cp_rd\u000aisacov.rv32i_andi_cg.cp_rd_rs1_hazard -p217 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp218 -sg15 -(lp219 -sg53 -(lp220 -sg13 -(dp221 -g56 -I0 -ssbtp222 -a(V001 -p223 -g1 -(g29 -g3 -Ntp224 -Rp225 -(dp226 -g8 -V001 -p227 -sg23 -VVP_ISA_F011_S003_I001 -p228 -sg35 -Vandi rd, rs1, imm[11:0]\u000ard = rs1 & Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p229 -sg37 -VISA\u000aChapter 2.4 -p230 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p231 -sg41 -Visacov.rv32i_andi_cg.cp_rs1_value\u000aisacov.rv32i_andi_cg.cp_immi_value\u000aisacov.rv32i_andi_cg.cross_rs1_immi_value\u000aisacov.rv32i_andi_cg.cp_rs1_toggle\u000aisacov.rv32i_andi_cg.cp_immi_toggle -p232 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp233 -sg15 -(lp234 -sg53 -(lp235 -sg13 -(dp236 -g56 -I0 -ssbtp237 -a(V002 -p238 -g1 -(g29 -g3 -Ntp239 -Rp240 -(dp241 -g8 -V002 -p242 -sg23 -VVP_ISA_F011_S003_I002 -p243 -sg35 -Vandi rd, rs1, imm[11:0]\u000ard = rs1 & Sext(imm[11:0])\u000aNote: this is a bitwise, not logical operation -p244 -sg37 -VISA\u000aChapter 2.4 -p245 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p246 -sg41 -Visacov.rv32i_andi_cg.cp_rd_value\u000aisacov.rv32i_andi_cg.cp_rd_toggle -p247 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp248 -sg15 -(lp249 -sg53 -(lp250 -sg13 -(dp251 -g56 -I0 -ssbtp252 -asg88 -(lp253 -sg53 -(lp254 -sg13 -(dp255 -sbtp256 -a(V004_SLTI -p257 -g1 -(g18 -g3 -Ntp258 -Rp259 -(dp260 -g22 -I3 -sg8 -g257 -sg23 -VVP_IP011_P004 -p261 -sg25 -(dp262 -sg12 -I4 -sg15 -(lp263 -(V000 -p264 -g1 -(g29 -g3 -Ntp265 -Rp266 -(dp267 -g8 -V000 -p268 -sg23 -VVP_ISA_F011_S004_I000 -p269 -sg35 -Vslti rd, rs1, imm[11:0]\u000ard = (rs1 < Sext(imm[11:0]) ? 1 : 0\u000aBoth imm and rs1 treated as signed numbers -p270 -sg37 -VISA\u000aChapter 2.4 -p271 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p272 -sg41 -Visacov.rv32i_slti_cg.cp_rs1\u000aisacov.rv32i_slti_cg.cp_rd\u000aisacov.rv32i_slti_cg.cp_rd_rs1_hazard -p273 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp274 -sg15 -(lp275 -sg53 -(lp276 -sg13 -(dp277 -g56 -I0 -ssbtp278 -a(V001 -p279 -g1 -(g29 -g3 -Ntp280 -Rp281 -(dp282 -g8 -V001 -p283 -sg23 -VVP_ISA_F011_S004_I001 -p284 -sg35 -Vslti rd, rs1, imm[11:0]\u000ard = (rs1 < Sext(imm[11:0]) ? 1 : 0\u000aBoth imm and rs1 treated as signed numbers -p285 -sg37 -VISA\u000aChapter 2.4 -p286 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p287 -sg41 -Visacov.rv32i_slti_cg.cp_rs1_value\u000aisacov.rv32i_slti_cg.cp_immi_value\u000aisacov.rv32i_slti_cg.cross_rs1_immi_value\u000aisacov.rv32i_slti_cg.cp_rs1_toggle\u000aisacov.rv32i_slti_cg.cp_immi_toggle -p288 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp289 -sg15 -(lp290 -sg53 -(lp291 -sg13 -(dp292 -g56 -I0 -ssbtp293 -a(V002 -p294 -g1 -(g29 -g3 -Ntp295 -Rp296 -(dp297 -g8 -V002 -p298 -sg23 -VVP_ISA_F011_S004_I002 -p299 -sg35 -Vslti rd, rs1, imm[11:0]\u000ard = (rs1 < Sext(imm[11:0]) ? 1 : 0\u000aBoth imm and rs1 treated as signed numbers -p300 -sg37 -VISA\u000aChapter 2.4 -p301 -sg39 -VOutput result:\u000a\u000ard value is in [0,1] -p302 -sg41 -Visacov.rv32i_slti_cg.cp_rd_value -p303 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp304 -sg15 -(lp305 -sg53 -(lp306 -sg13 -(dp307 -g56 -I0 -ssbtp308 -asg88 -(lp309 -sg53 -(lp310 -sg13 -(dp311 -sbtp312 -a(V005_SLTIU -p313 -g1 -(g18 -g3 -Ntp314 -Rp315 -(dp316 -g22 -I3 -sg8 -g313 -sg23 -VVP_IP011_P005 -p317 -sg25 -(dp318 -sg12 -I5 -sg15 -(lp319 -(V000 -p320 -g1 -(g29 -g3 -Ntp321 -Rp322 -(dp323 -g8 -V000 -p324 -sg23 -VVP_ISA_F011_S005_I000 -p325 -sg35 -Vsltiu rd, rs1, imm[11:0]\u000ard = (rs1 < Sext(imm[11:0]) ? 1 : 0\u000aBoth imm and rs1 treated as unsigned numbers -p326 -sg37 -VISA\u000aChapter 2.4 -p327 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p328 -sg41 -Visacov.rv32i_sltiu_cg.cp_rs1\u000aisacov.rv32i_sltiu_cg.cp_rd\u000aisacov.rv32i_sltiu_cg.cp_rd_rs1_hazard -p329 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp330 -sg15 -(lp331 -sg53 -(lp332 -sg13 -(dp333 -g56 -I0 -ssbtp334 -a(V001 -p335 -g1 -(g29 -g3 -Ntp336 -Rp337 -(dp338 -g8 -V001 -p339 -sg23 -VVP_ISA_F011_S005_I001 -p340 -sg35 -Vsltiu rd, rs1, imm[11:0]\u000ard = (rs1 < Sext(imm[11:0]) ? 1 : 0\u000aBoth imm and rs1 treated as unsigned numbers -p341 -sg37 -VISA\u000aChapter 2.4 -p342 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p343 -sg41 -Visacov.rv32i_sltiu_cg.cp_rs1_value\u000aisacov.rv32i_sltiu_cg.cp_immi_value\u000aisacov.rv32i_sltiu_cg.cross_rs1_immi_value\u000aisacov.rv32i_sltiu_cg.cp_rs1_toggle\u000aisacov.rv32i_sltiu_cg.cp_immi_toggle -p344 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp345 -sg15 -(lp346 -sg53 -(lp347 -sg13 -(dp348 -g56 -I0 -ssbtp349 -a(V002 -p350 -g1 -(g29 -g3 -Ntp351 -Rp352 -(dp353 -g8 -V002 -p354 -sg23 -VVP_ISA_F011_S005_I002 -p355 -sg35 -Vsltiu rd, rs1, imm[11:0]\u000ard = (rs1 < Sext(imm[11:0]) ? 1 : 0\u000aBoth imm and rs1 treated as unsigned numbers -p356 -sg37 -VISA\u000aChapter 2.4 -p357 -sg39 -VOutput result:\u000a\u000ard value is in [0,1] -p358 -sg41 -Visacov.rv32i_sltiu_cg.cp_rd_value -p359 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp360 -sg15 -(lp361 -sg53 -(lp362 -sg13 -(dp363 -g56 -I0 -ssbtp364 -asg88 -(lp365 -sg53 -(lp366 -sg13 -(dp367 -sbtp368 -a(V006_SLLI -p369 -g1 -(g18 -g3 -Ntp370 -Rp371 -(dp372 -g22 -I3 -sg8 -g369 -sg23 -VVP_IP011_P006 -p373 -sg25 -(dp374 -sg12 -I6 -sg15 -(lp375 -(V000 -p376 -g1 -(g29 -g3 -Ntp377 -Rp378 -(dp379 -g8 -V000 -p380 -sg23 -VVP_ISA_F011_S006_I000 -p381 -sg35 -Vslli rd, rs, imm[4:0]\u000ard = rs << imm[4:0]\u000aZeros are shirfted into lower bits -p382 -sg37 -VISA\u000aChapter 2.4 -p383 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p384 -sg41 -Visacov.rv32i_slli_cg.cp_rs1\u000aisacov.rv32i_slli_cg.cp_rd\u000aisacov.rv32i_slli_cg.cp_rd_rs1_hazard -p385 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp386 -sg15 -(lp387 -sg53 -(lp388 -sg13 -(dp389 -g56 -I0 -ssbtp390 -a(V001 -p391 -g1 -(g29 -g3 -Ntp392 -Rp393 -(dp394 -g8 -V001 -p395 -sg23 -VVP_ISA_F011_S006_I001 -p396 -sg35 -Vslli rd, rs, imm[4:0]\u000ard = rs << imm[4:0]\u000aZeros are shirfted into lower bits -p397 -sg37 -VISA\u000aChapter 2.4 -p398 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmediate shamt value is [0,31]\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled -p399 -sg41 -Visacov.rv32i_slli_cg.cp_rs1_value\u000aisacov.rv32i_slli_cg.cp_immi_value\u000aisacov.rv32i_slli_cg.cross_rs1_immi_value\u000aisacov.rv32i_slli_cg.cp_rs1_toggle -p400 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp401 -sg15 -(lp402 -sg53 -(lp403 -sg13 -(dp404 -g56 -I0 -ssbtp405 -a(V002 -p406 -g1 -(g29 -g3 -Ntp407 -Rp408 -(dp409 -g8 -V002 -p410 -sg23 -VVP_ISA_F011_S006_I002 -p411 -sg35 -Vslli rd, rs, imm[4:0]\u000ard = rs << imm[4:0]\u000aZeros are shirfted into lower bits -p412 -sg37 -VISA\u000aChapter 2.4 -p413 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p414 -sg41 -Visacov.rv32i_slli_cg.cp_rd_value\u000aisacov.rv32i_slli_cg.cp_rd_toggle -p415 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp416 -sg15 -(lp417 -sg53 -(lp418 -sg13 -(dp419 -g56 -I0 -ssbtp420 -asg88 -(lp421 -sg53 -(lp422 -sg13 -(dp423 -sbtp424 -a(V007_SRLI -p425 -g1 -(g18 -g3 -Ntp426 -Rp427 -(dp428 -g22 -I4 -sg8 -g425 -sg23 -VVP_IP011_P007 -p429 -sg25 -(dp430 -sg12 -I7 -sg15 -(lp431 -(V000 -p432 -g1 -(g29 -g3 -Ntp433 -Rp434 -(dp435 -g8 -V000 -p436 -sg23 -VVP_ISA_F011_S007_I000 -p437 -sg35 -Vsrli rd, rs, imm[4:0]\u000ard = rs >> imm[4:0]\u000aZeros are shirfted into upper bits -p438 -sg37 -VISA\u000aChapter 2.4 -p439 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p440 -sg41 -Visacov.rv32i_srli_cg.cp_rs1\u000aisacov.rv32i_srli_cg.cp_rd\u000aisacov.rv32i_srli_cg.cp_rd_rs1_hazard -p441 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp442 -sg15 -(lp443 -sg53 -(lp444 -sg13 -(dp445 -g56 -I0 -ssbtp446 -a(V001 -p447 -g1 -(g29 -g3 -Ntp448 -Rp449 -(dp450 -g8 -g447 -sg23 -VVP_ISA_F011_S007_I001 -p451 -sg35 -Vsrli rd, rs, imm[4:0]\u000ard = rs >> imm[4:0]\u000aZeros are shirfted into upper bits -p452 -sg37 -VISA\u000aChapter 2.4 -p453 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmediate shamt value is [0,31]\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled -p454 -sg41 -Visacov.rv32i_srli_cg.cp_rs1_value\u000aisacov.rv32i_srli_cg.cp_immi_value\u000aisacov.rv32i_srli_cg.cross_rs1_immi_value\u000aisacov.rv32i_srli_cg.cp_rs1_toggle -p455 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp456 -sg15 -(lp457 -sg53 -(lp458 -sg13 -(dp459 -g56 -I0 -ssbtp460 -a(V002 -p461 -g1 -(g29 -g3 -Ntp462 -Rp463 -(dp464 -g8 -g461 -sg23 -VVP_ISA_F011_S007_I002 -p465 -sg35 -Vsrli rd, rs, imm[4:0]\u000ard = rs >> imm[4:0]\u000aZeros are shirfted into upper bits -p466 -sg37 -VISA\u000aChapter 2.4 -p467 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p468 -sg41 -Visacov.rv32i_srli_cg.cp_rd_value\u000aisacov.rv32i_srli_cg.cp_rd_toggle -p469 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp470 -sg15 -(lp471 -sg53 -(lp472 -sg13 -(dp473 -g56 -I0 -ssbtp474 -asg88 -(lp475 -sg53 -(lp476 -sg13 -(dp477 -sbtp478 -a(V008_SRAI -p479 -g1 -(g18 -g3 -Ntp480 -Rp481 -(dp482 -g22 -I3 -sg8 -g479 -sg23 -VVP_IP011_P008 -p483 -sg25 -(dp484 -sg12 -I8 -sg15 -(lp485 -(V000 -p486 -g1 -(g29 -g3 -Ntp487 -Rp488 -(dp489 -g8 -V000 -p490 -sg23 -VVP_ISA_F011_S008_I000 -p491 -sg35 -Vsrli rd, rs, imm[4:0]\u000ard = rs >> imm[4:0]\u000aThe original sign bit is copied into the vacated upper bits -p492 -sg37 -VISA\u000aChapter 2.4 -p493 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p494 -sg41 -Visacov.rv32i_srai_cg.cp_rs1\u000aisacov.rv32i_srai_cg.cp_rd\u000aisacov.rv32i_srai_cg.cp_rd_rs1_hazard -p495 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp496 -sg15 -(lp497 -sg53 -(lp498 -sg13 -(dp499 -g56 -I0 -ssbtp500 -a(V001 -p501 -g1 -(g29 -g3 -Ntp502 -Rp503 -(dp504 -g8 -V001 -p505 -sg23 -VVP_ISA_F011_S008_I001 -p506 -sg35 -Vsrli rd, rs, imm[4:0]\u000ard = rs >> imm[4:0]\u000aThe original sign bit is copied into the vacated upper bits -p507 -sg37 -VISA\u000aChapter 2.4 -p508 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmediate shamt value is [0,31]\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled -p509 -sg41 -Visacov.rv32i_srai_cg.cp_rs1_value\u000aisacov.rv32i_srai_cg.cp_immi_value\u000aisacov.rv32i_srai_cg.cross_rs1_immi_value\u000aisacov.rv32i_srai_cg.cp_rs1_toggle -p510 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp511 -sg15 -(lp512 -sg53 -(lp513 -sg13 -(dp514 -g56 -I0 -ssbtp515 -a(V002 -p516 -g1 -(g29 -g3 -Ntp517 -Rp518 -(dp519 -g8 -V002 -p520 -sg23 -VVP_ISA_F011_S008_I002 -p521 -sg35 -Vsrli rd, rs, imm[4:0]\u000ard = rs >> imm[4:0]\u000aZeros are shirfted into upper bits -p522 -sg37 -VISA\u000aChapter 2.4 -p523 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p524 -sg41 -Visacov.rv32i_srai_cg.cp_rd_value\u000aisacov.rv32i_srai_cg.cp_rd_toggle -p525 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp526 -sg15 -(lp527 -sg53 -(lp528 -sg13 -(dp529 -g56 -I0 -ssbtp530 -asg88 -(lp531 -sg53 -(lp532 -sg13 -(dp533 -sbtp534 -a(V009_LUI -p535 -g1 -(g18 -g3 -Ntp536 -Rp537 -(dp538 -g22 -I3 -sg8 -g535 -sg23 -VVP_IP011_P009 -p539 -sg25 -(dp540 -sg12 -I9 -sg15 -(lp541 -(V000 -p542 -g1 -(g29 -g3 -Ntp543 -Rp544 -(dp545 -g8 -V000 -p546 -sg23 -VVP_ISA_F011_S009_I000 -p547 -sg35 -Vlui rd, imm[19:0]\u000ard = imm[19:0] << 12\u000ard[11:0] is zero-filled. -p548 -sg37 -VISA\u000aChapter 2.4 -p549 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p550 -sg41 -Visacov.rv32i_lui_cg.cp_rd -p551 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp552 -sg15 -(lp553 -sg53 -(lp554 -sg13 -(dp555 -g56 -I0 -ssbtp556 -a(V001 -p557 -g1 -(g29 -g3 -Ntp558 -Rp559 -(dp560 -g8 -V001 -p561 -sg23 -VVP_ISA_F011_S009_I001 -p562 -sg35 -Vlui rd, imm[19:0]\u000ard = imm[19:0] << 12\u000ard[11:0] is zero-filled. -p563 -sg37 -VISA\u000aChapter 2.4 -p564 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmediate value is zero and non-zero\u000aAll bits of immu are toggled -p565 -sg41 -Visacov.rv32i_lui_cg.cp_immu_value\u000aisacov.rv32i_lui_cg.cp_immu_toggle -p566 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp567 -sg15 -(lp568 -sg53 -(lp569 -sg13 -(dp570 -g56 -I0 -ssbtp571 -a(V002 -p572 -g1 -(g29 -g3 -Ntp573 -Rp574 -(dp575 -g8 -V002 -p576 -sg23 -VVP_ISA_F011_S009_I002 -p577 -sg35 -Vlui rd, imm[19:0]\u000ard = imm[19:0] << 12\u000ard[11:0] is zero-filled. -p578 -sg37 -VISA\u000aChapter 2.4 -p579 -sg39 -VOutput result:\u000a\u000ard value is zero and non-zero\u000aAll bits of rd[31:12] are toggled (11:0 are deposited with 0) -p580 -sg41 -Visacov.rv32i_lui_cg.cp_rd_value\u000aisacov.rv32i_lui_cg.cp_rd_toggle -p581 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp582 -sg15 -(lp583 -sg53 -(lp584 -sg13 -(dp585 -g56 -I0 -ssbtp586 -asg88 -(lp587 -sg53 -(lp588 -sg13 -(dp589 -sbtp590 -a(V010_AUIPC -p591 -g1 -(g18 -g3 -Ntp592 -Rp593 -(dp594 -g22 -I3 -sg8 -g591 -sg23 -VVP_IP011_P010 -p595 -sg25 -(dp596 -sg12 -I10 -sg15 -(lp597 -(V000 -p598 -g1 -(g29 -g3 -Ntp599 -Rp600 -(dp601 -g8 -V000 -p602 -sg23 -VVP_ISA_F011_S010_I000 -p603 -sg35 -Vauipc rd, imm[19:0]\u000ard = pc + (imm[19:0] << 12)\u000apc is address of auipc instruction\u000a\u000aAssumption: arithmetic overflow is lost and ignored. -p604 -sg37 -VISA\u000aChapter 2.4 -p605 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p606 -sg41 -Visacov.rv32i_auipc_cg.cp_rd -p607 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp608 -sg15 -(lp609 -sg53 -(lp610 -sg13 -(dp611 -g56 -I0 -ssbtp612 -a(V001 -p613 -g1 -(g29 -g3 -Ntp614 -Rp615 -(dp616 -g8 -V001 -p617 -sg23 -VVP_ISA_F011_S010_I001 -p618 -sg35 -Vauipc rd, imm[19:0]\u000ard = pc + (imm[19:0] << 12)\u000apc is address of auipc instruction\u000a\u000aAssumption: arithmetic overflow is lost and ignored. -p619 -sg37 -VISA\u000aChapter 2.4 -p620 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000aimmediate value is zero and non-zero\u000aAll bits of immu are toggled -p621 -sg41 -Visacov.rv32i_auipc_cg.cp_immu_value\u000aisacov.rv32i_auipc_cg.cp_immu_toggle -p622 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp623 -sg15 -(lp624 -sg53 -(lp625 -sg13 -(dp626 -g56 -I0 -ssbtp627 -a(V002 -p628 -g1 -(g29 -g3 -Ntp629 -Rp630 -(dp631 -g8 -V002 -p632 -sg23 -VVP_ISA_F011_S010_I002 -p633 -sg35 -Vauipc rd, imm[19:0]\u000ard = pc + (imm[19:0] << 12)\u000apc is address of auipc instruction\u000a\u000aAssumption: arithmetic overflow is lost and ignored. -p634 -sg37 -VISA\u000aChapter 2.4 -p635 -sg39 -VOutput result:\u000a\u000ard value is zero and non-zero\u000aAll bits of rd[31:12] are toggled (11:0 are deposited with 0) -p636 -sg41 -Visacov.rv32i_auipc_cg.cp_rd_value\u000aisacov.rv32i_auipc_cg.cp_rd_toggle -p637 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp638 -sg15 -(lp639 -sg53 -(lp640 -sg13 -(dp641 -g56 -I0 -ssbtp642 -asg88 -(lp643 -sg53 -(lp644 -sg13 -(dp645 -sbtp646 -asVrfu_list_0 -p647 -(lp648 -sg88 -(lp649 -sVvptool_gitrev -p650 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p651 -sVio_fmt_gitrev -p652 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p653 -sVconfig_gitrev -p654 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p655 -sVymlcfg_gitrev -p656 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p657 -sbtp658 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml new file mode 100644 index 000000000..70b22805d --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml @@ -0,0 +1,697 @@ +!Feature +next_elt_id: 11 +name: RV32I Register-Immediate Instructions +id: 0 +display_order: 0 +subfeatures: !!omap +- 000_ADDI: !Subfeature + name: 000_ADDI + tag: VP_IP011_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S000_I000 + description: "addi rd, rs1, imm[11:0]\nrd = rs1 + Sext(imm[11:0])\nArithmetic\ + \ overflow is lost and ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_addi_cg.cp_rs1\nisacov.rv32i_addi_cg.cp_rd\nisacov.rv32i_addi_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S000_I001 + description: "addi rd, rs1, imm[11:0]\nrd = rs1 + Sext(imm[11:0])\nArithmetic\ + \ overflow is lost and ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmi value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and immi +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_addi_cg.cp_rs1_value\nisacov.rv32i_addi_cg.cp_immi_value\n\ + isacov.rv32i_addi_cg.cross_rs1_immi_value\nisacov.rv32i_addi_cg.cp_rs1_toggle\n\ + isacov.rv32i_addi_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S000_I002 + description: "addi rd, rs1, imm[11:0]\nrd = rs1 + Sext(imm[11:0])\nArithmetic\ + \ overflow is lost and ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_addi_cg.cp_rd_value\nisacov.rv32i_addi_cg.cp_rd_toggle" + comments: '' +- 001_XORI: !Subfeature + name: 001_XORI + tag: VP_IP011_P001 + next_elt_id: 5 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S001_I000 + description: "xori rd, rs1, imm[11:0]\nrd = rs1 ^ Sext(imm[11:0])\nNote: this\ + \ is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_xori_cg.cp_rs1\nisacov.rv32i_xori_cg.cp_rd\nisacov.rv32i_xori_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S001_I001 + description: "xori rd, rs1, imm[11:0]\nrd = rs1 ^ Sext(imm[11:0])\nNote: this\ + \ is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmi value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and immi +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_xori_cg.cp_rs1_value\nisacov.rv32i_xori_cg.cp_immi_value\n\ + isacov.rv32i_xori_cg.cross_rs1_immi_value\nisacov.rv32i_xori_cg.cp_rs1_toggle\n\ + isacov.rv32i_xori_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S001_I002 + description: "xori rd, rs1, imm[11:0]\nrd = rs1 ^ Sext(imm[11:0])\nNote: this\ + \ is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_xori_cg.cp_rd_value\nisacov.rv32i_xori_cg.cp_rd_toggle" + comments: '' +- 002_ORI: !Subfeature + name: 002_ORI + tag: VP_IP011_P002 + next_elt_id: 4 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S002_I000 + description: "ori rd, rs1, imm[11:0]\nrd = rs1 | Sext(imm[11:0])\nNote: this\ + \ is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_ori_cg.cp_rs1\nisacov.rv32i_ori_cg.cp_rd\nisacov.rv32i_ori_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S002_I001 + description: "ori rd, rs1, imm[11:0]\nrd = rs1 | Sext(imm[11:0])\nNote: this\ + \ is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmi value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and immi +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_ori_cg.cp_rs1_value\nisacov.rv32i_ori_cg.cp_immi_value\n\ + isacov.rv32i_ori_cg.cross_rs1_immi_value\nisacov.rv32i_ori_cg.cp_rs1_toggle\n\ + isacov.rv32i_ori_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S002_I002 + description: "ori rd, rs1, imm[11:0]\nrd = rs1 | Sext(imm[11:0])\nNote: this\ + \ is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_ori_cg.cp_rd_value\nisacov.rv32i_ori_cg.cp_rd_toggle" + comments: '' +- 003_ANDI: !Subfeature + name: 003_ANDI + tag: VP_IP011_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S003_I000 + description: "andi rd, rs1, imm[11:0]\nrd = rs1 & Sext(imm[11:0])\nNote:\ + \ this is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_andi_cg.cp_rs1\nisacov.rv32i_andi_cg.cp_rd\nisacov.rv32i_andi_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S003_I001 + description: "andi rd, rs1, imm[11:0]\nrd = rs1 & Sext(imm[11:0])\nNote:\ + \ this is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmi value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and immi +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_andi_cg.cp_rs1_value\nisacov.rv32i_andi_cg.cp_immi_value\n\ + isacov.rv32i_andi_cg.cross_rs1_immi_value\nisacov.rv32i_andi_cg.cp_rs1_toggle\n\ + isacov.rv32i_andi_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S003_I002 + description: "andi rd, rs1, imm[11:0]\nrd = rs1 & Sext(imm[11:0])\nNote:\ + \ this is a bitwise, not logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_andi_cg.cp_rd_value\nisacov.rv32i_andi_cg.cp_rd_toggle" + comments: '' +- 004_SLTI: !Subfeature + name: 004_SLTI + tag: VP_IP011_P004 + next_elt_id: 3 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S004_I000 + description: "slti rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 : 0\n\ + Both imm and rs1 treated as signed numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slti_cg.cp_rs1\nisacov.rv32i_slti_cg.cp_rd\nisacov.rv32i_slti_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S004_I001 + description: "slti rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 : 0\n\ + Both imm and rs1 treated as signed numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmi value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and immi +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slti_cg.cp_rs1_value\nisacov.rv32i_slti_cg.cp_immi_value\n\ + isacov.rv32i_slti_cg.cross_rs1_immi_value\nisacov.rv32i_slti_cg.cp_rs1_toggle\n\ + isacov.rv32i_slti_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S004_I002 + description: "slti rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 : 0\n\ + Both imm and rs1 treated as signed numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is in [0,1]" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_slti_cg.cp_rd_value + comments: '' +- 005_SLTIU: !Subfeature + name: 005_SLTIU + tag: VP_IP011_P005 + next_elt_id: 3 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S005_I000 + description: "sltiu rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 :\ + \ 0\nBoth imm and rs1 treated as unsigned numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sltiu_cg.cp_rs1\nisacov.rv32i_sltiu_cg.cp_rd\n\ + isacov.rv32i_sltiu_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S005_I001 + description: "sltiu rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 :\ + \ 0\nBoth imm and rs1 treated as unsigned numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmi value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and immi +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sltiu_cg.cp_rs1_value\nisacov.rv32i_sltiu_cg.cp_immi_value\n\ + isacov.rv32i_sltiu_cg.cross_rs1_immi_value\nisacov.rv32i_sltiu_cg.cp_rs1_toggle\n\ + isacov.rv32i_sltiu_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S005_I002 + description: "sltiu rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 :\ + \ 0\nBoth imm and rs1 treated as unsigned numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is in [0,1]" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_sltiu_cg.cp_rd_value + comments: '' +- 006_SLLI: !Subfeature + name: 006_SLLI + tag: VP_IP011_P006 + next_elt_id: 3 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S006_I000 + description: "slli rd, rs, imm[4:0]\nrd = rs << imm[4:0]\nZeros are shirfted\ + \ into lower bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slli_cg.cp_rs1\nisacov.rv32i_slli_cg.cp_rd\nisacov.rv32i_slli_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S006_I001 + description: "slli rd, rs, imm[4:0]\nrd = rs << imm[4:0]\nZeros are shirfted\ + \ into lower bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmediate\ + \ shamt value is [0,31]\nAll combinations of rs1 and immi +ve, -ve, and\ + \ zero values are used\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slli_cg.cp_rs1_value\nisacov.rv32i_slli_cg.cp_immi_value\n\ + isacov.rv32i_slli_cg.cross_rs1_immi_value\nisacov.rv32i_slli_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S006_I002 + description: "slli rd, rs, imm[4:0]\nrd = rs << imm[4:0]\nZeros are shirfted\ + \ into lower bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slli_cg.cp_rd_value\nisacov.rv32i_slli_cg.cp_rd_toggle" + comments: '' +- 007_SRLI: !Subfeature + name: 007_SRLI + tag: VP_IP011_P007 + next_elt_id: 4 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S007_I000 + description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ + \ into upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srli_cg.cp_rs1\nisacov.rv32i_srli_cg.cp_rd\nisacov.rv32i_srli_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S007_I001 + description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ + \ into upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmediate\ + \ shamt value is [0,31]\nAll combinations of rs1 and immi +ve, -ve, and\ + \ zero values are used\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srli_cg.cp_rs1_value\nisacov.rv32i_srli_cg.cp_immi_value\n\ + isacov.rv32i_srli_cg.cross_rs1_immi_value\nisacov.rv32i_srli_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S007_I002 + description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ + \ into upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srli_cg.cp_rd_value\nisacov.rv32i_srli_cg.cp_rd_toggle" + comments: '' +- 008_SRAI: !Subfeature + name: 008_SRAI + tag: VP_IP011_P008 + next_elt_id: 3 + display_order: 8 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S008_I000 + description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nThe original sign\ + \ bit is copied into the vacated upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srai_cg.cp_rs1\nisacov.rv32i_srai_cg.cp_rd\nisacov.rv32i_srai_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S008_I001 + description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nThe original sign\ + \ bit is copied into the vacated upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmediate\ + \ shamt value is [0,31]\nAll combinations of rs1 and immi +ve, -ve, and\ + \ zero values are used\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srai_cg.cp_rs1_value\nisacov.rv32i_srai_cg.cp_immi_value\n\ + isacov.rv32i_srai_cg.cross_rs1_immi_value\nisacov.rv32i_srai_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S008_I002 + description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ + \ into upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srai_cg.cp_rd_value\nisacov.rv32i_srai_cg.cp_rd_toggle" + comments: '' +- 009_LUI: !Subfeature + name: 009_LUI + tag: VP_IP011_P009 + next_elt_id: 3 + display_order: 9 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S009_I000 + description: "lui rd, imm[19:0]\nrd = imm[19:0] << 12\nrd[11:0] is zero-filled." + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_lui_cg.cp_rd + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S009_I001 + description: "lui rd, imm[19:0]\nrd = imm[19:0] << 12\nrd[11:0] is zero-filled." + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmediate\ + \ value is zero and non-zero\nAll bits of immu are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lui_cg.cp_immu_value\nisacov.rv32i_lui_cg.cp_immu_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S009_I002 + description: "lui rd, imm[19:0]\nrd = imm[19:0] << 12\nrd[11:0] is zero-filled." + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is zero and non-zero\nAll bits of\ + \ rd[31:12] are toggled (11:0 are deposited with 0)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lui_cg.cp_rd_value\nisacov.rv32i_lui_cg.cp_rd_toggle" + comments: '' +- 010_AUIPC: !Subfeature + name: 010_AUIPC + tag: VP_IP011_P010 + next_elt_id: 3 + display_order: 10 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F011_S010_I000 + description: "auipc rd, imm[19:0]\nrd = pc + (imm[19:0] << 12)\npc is address\ + \ of auipc instruction\n\nAssumption: arithmetic overflow is lost and ignored." + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_auipc_cg.cp_rd + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F011_S010_I001 + description: "auipc rd, imm[19:0]\nrd = pc + (imm[19:0] << 12)\npc is address\ + \ of auipc instruction\n\nAssumption: arithmetic overflow is lost and ignored." + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nimmediate\ + \ value is zero and non-zero\nAll bits of immu are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_auipc_cg.cp_immu_value\nisacov.rv32i_auipc_cg.cp_immu_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F011_S010_I002 + description: "auipc rd, imm[19:0]\nrd = pc + (imm[19:0] << 12)\npc is address\ + \ of auipc instruction\n\nAssumption: arithmetic overflow is lost and ignored." + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is zero and non-zero\nAll bits of\ + \ rd[31:12] are toggled (11:0 are deposited with 0)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_auipc_cg.cp_rd_value\nisacov.rv32i_auipc_cg.cp_rd_toggle" + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.pck deleted file mode 100644 index 4c356dddb..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.pck +++ /dev/null @@ -1,1828 +0,0 @@ -(VRV32I Register-Register Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I10 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I1 -sVwid_order -p12 -I1 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_ADD -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I4 -sg8 -g17 -sVtag -p23 -VVP_IP001_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F001_S000_I000 -p34 -sVdescription -p35 -Vadd rd, rs1, rs2\u000ard = rs1 + rs2\u000aArithmetic overflow is lost and ignored -p36 -sVpurpose -p37 -VISA\u000aChapter 2.4 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p40 -sVcoverage_loc -p41 -Visacov.rv32i_add_cg.cp_rs1\u000aisacov.rv32i_add_cg.cp_rs2\u000aisacov.rv32i_add_cg.cp_rd\u000aisacov.rv32i_add_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_add_cg.cp_rd_rs2_hazard -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -g58 -sg23 -VVP_ISA_F001_S000_I001 -p62 -sg35 -Vadd rd, rs1, rs2\u000ard = rs1 + rs2\u000aArithmetic overflow is lost and ignored -p63 -sg37 -VISA\u000aChapter 2.4 -p64 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p65 -sg41 -Visacov.rv32i_add_cg.cp_rs1_value\u000aisacov.rv32i_add_cg.cp_rs2_value\u000aisacov.rv32i_add_cg.cross_rs1_rs2_value\u000aisacov.rv32i_add_cg.cp_rs1_toggle\u000aisacov.rv32i_add_cg.cp_rs2_toggle -p66 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp67 -sg15 -(lp68 -sg53 -(lp69 -sg13 -(dp70 -g56 -I0 -ssbtp71 -a(V002 -p72 -g1 -(g29 -g3 -Ntp73 -Rp74 -(dp75 -g8 -g72 -sg23 -VVP_ISA_F001_S000_I002 -p76 -sg35 -Vadd rd, rs1, rs2\u000ard = rs1 + rs2\u000aArithmetic overflow is lost and ignored -p77 -sg37 -VISA\u000aChapter 2.4 -p78 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p79 -sg41 -Visacov.rv32i_add_cg.cp_rd_value\u000aisacov.rv32i_add_cg.cp_rd_toggle -p80 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp81 -sg15 -(lp82 -sg53 -(lp83 -sg13 -(dp84 -g56 -I0 -ssbtp85 -asVrfu_list_1 -p86 -(lp87 -sg53 -(lp88 -sg13 -(dp89 -sbtp90 -a(V001_SUB -p91 -g1 -(g18 -g3 -Ntp92 -Rp93 -(dp94 -g22 -I3 -sg8 -g91 -sg23 -VVP_IP001_P001 -p95 -sg25 -(dp96 -sg12 -I1 -sg15 -(lp97 -(V000 -p98 -g1 -(g29 -g3 -Ntp99 -Rp100 -(dp101 -g8 -V000 -p102 -sg23 -VVP_ISA_F001_S001_I000 -p103 -sg35 -Vsub rd, rs1, rs2\u000ard = rs1 - rs2\u000aArithmetic underflow is ignored -p104 -sg37 -VISA\u000aChapter 2.4 -p105 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p106 -sg41 -Visacov.rv32i_sub_cg.cp_rs1\u000aisacov.rv32i_sub_cg.cp_rs2\u000aisacov.rv32i_sub_cg.cp_rd\u000aisacov.rv32i_sub_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_sub_cg.cp_rd_rs2_hazard -p107 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp108 -sg15 -(lp109 -sg53 -(lp110 -sg13 -(dp111 -g56 -I0 -ssbtp112 -a(V001 -p113 -g1 -(g29 -g3 -Ntp114 -Rp115 -(dp116 -g8 -V001 -p117 -sg23 -VVP_ISA_F001_S001_I001 -p118 -sg35 -Vsub rd, rs1, rs2\u000ard = rs1 - rs2\u000aArithmetic underflow is ignored -p119 -sg37 -VISA\u000aChapter 2.4 -p120 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p121 -sg41 -Visacov.rv32i_sub_cg.cp_rs1_value\u000aisacov.rv32i_sub_cg.cp_rs2_value\u000aisacov.rv32i_sub_cg.cross_rs1_rs2_value\u000aisacov.rv32i_sub_cg.cp_rs1_toggle\u000aisacov.rv32i_sub_cg.cp_rs2_toggle -p122 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp123 -sg15 -(lp124 -sg53 -(lp125 -sg13 -(dp126 -g56 -I0 -ssbtp127 -a(V002 -p128 -g1 -(g29 -g3 -Ntp129 -Rp130 -(dp131 -g8 -V002 -p132 -sg23 -VVP_ISA_F001_S001_I002 -p133 -sg35 -Vsub rd, rs1, rs2\u000ard = rs1 - rs2\u000aArithmetic underflow is ignored -p134 -sg37 -VISA\u000aChapter 2.4 -p135 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p136 -sg41 -Visacov.rv32i_sub_cg.cp_rd_value\u000aisacov.rv32i_sub_cg.cp_rd_toggle -p137 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp138 -sg15 -(lp139 -sg53 -(lp140 -sg13 -(dp141 -g56 -I0 -ssbtp142 -asg86 -(lp143 -sg53 -(lp144 -sg13 -(dp145 -sbtp146 -a(V002_AND -p147 -g1 -(g18 -g3 -Ntp148 -Rp149 -(dp150 -g22 -I3 -sg8 -g147 -sg23 -VVP_IP001_P002 -p151 -sg25 -(dp152 -sg12 -I2 -sg15 -(lp153 -(V000 -p154 -g1 -(g29 -g3 -Ntp155 -Rp156 -(dp157 -g8 -V000 -p158 -sg23 -VVP_ISA_F001_S002_I000 -p159 -sg35 -Vand rd, rs1, rs2\u000ard = rs1 & rs2\u000aNote: this is a bitwise, not logical operation -p160 -sg37 -VISA\u000aChapter 2.4 -p161 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p162 -sg41 -Visacov.rv32i_and_cg.cp_rs1\u000aisacov.rv32i_and_cg.cp_rs2\u000aisacov.rv32i_and_cg.cp_rd\u000aisacov.rv32i_and_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_and_cg.cp_rd_rs2_hazard\u000aisacov.rv32i_and_cg.cp_rs1\u000aisacov.rv32i_and_cg.cp_rs2\u000aisacov.rv32i_and_cg.cp_rd\u000aisacov.rv32i_and_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_and_cg.cp_rd_rs2_hazard -p163 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp164 -sg15 -(lp165 -sg53 -(lp166 -sg13 -(dp167 -g56 -I0 -ssbtp168 -a(V001 -p169 -g1 -(g29 -g3 -Ntp170 -Rp171 -(dp172 -g8 -V001 -p173 -sg23 -VVP_ISA_F001_S002_I001 -p174 -sg35 -Vand rd, rs1, rs2\u000ard = rs1 & rs2\u000aNote: this is a bitwise, not logical operation -p175 -sg37 -VISA\u000aChapter 2.4 -p176 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p177 -sg41 -Visacov.rv32i_and_cg.cp_rs1_value\u000aisacov.rv32i_and_cg.cp_rs2_value\u000aisacov.rv32i_and_cg.cross_rs1_rs2_value\u000aisacov.rv32i_and_cg.cp_rs1_toggle\u000aisacov.rv32i_and_cg.cp_rs2_toggle -p178 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp179 -sg15 -(lp180 -sg53 -(lp181 -sg13 -(dp182 -g56 -I0 -ssbtp183 -a(V002 -p184 -g1 -(g29 -g3 -Ntp185 -Rp186 -(dp187 -g8 -V002 -p188 -sg23 -VVP_ISA_F001_S002_I002 -p189 -sg35 -Vand rd, rs1, rs2\u000ard = rs1 & rs2\u000aNote: this is a bitwise, not logical operation -p190 -sg37 -VISA\u000aChapter 2.4 -p191 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p192 -sg41 -Visacov.rv32i_and_cg.cp_rd_value\u000aisacov.rv32i_and_cg.cp_rd_toggle -p193 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp194 -sg15 -(lp195 -sg53 -(lp196 -sg13 -(dp197 -g56 -I0 -ssbtp198 -asg86 -(lp199 -sg53 -(lp200 -sg13 -(dp201 -sbtp202 -a(V003_OR -p203 -g1 -(g18 -g3 -Ntp204 -Rp205 -(dp206 -g22 -I3 -sg8 -g203 -sg23 -VVP_IP001_P003 -p207 -sg25 -(dp208 -sg12 -I3 -sg15 -(lp209 -(V000 -p210 -g1 -(g29 -g3 -Ntp211 -Rp212 -(dp213 -g8 -V000 -p214 -sg23 -VVP_ISA_F001_S003_I000 -p215 -sg35 -Vor rd, rs1, rs2\u000ard = rs1 | rs2\u000aNote: this is a bitwise, not logical operation -p216 -sg37 -VISA\u000aChapter 2.4 -p217 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p218 -sg41 -Visacov.rv32i_or_cg.cp_rs1\u000aisacov.rv32i_or_cg.cp_rs2\u000aisacov.rv32i_or_cg.cp_rd\u000aisacov.rv32i_or_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_or_cg.cp_rd_rs2_hazard -p219 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp220 -sg15 -(lp221 -sg53 -(lp222 -sg13 -(dp223 -g56 -I0 -ssbtp224 -a(V001 -p225 -g1 -(g29 -g3 -Ntp226 -Rp227 -(dp228 -g8 -V001 -p229 -sg23 -VVP_ISA_F001_S003_I001 -p230 -sg35 -Vor rd, rs1, rs2\u000ard = rs1 | rs2\u000aNote: this is a bitwise, not logical operation -p231 -sg37 -VISA\u000aChapter 2.4 -p232 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p233 -sg41 -Visacov.rv32i_or_cg.cp_rs1_value\u000aisacov.rv32i_or_cg.cp_rs2_value\u000aisacov.rv32i_or_cg.cross_rs1_rs2_value\u000aisacov.rv32i_or_cg.cp_rs1_toggle\u000aisacov.rv32i_or_cg.cp_rs2_toggle -p234 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp235 -sg15 -(lp236 -sg53 -(lp237 -sg13 -(dp238 -g56 -I0 -ssbtp239 -a(V002 -p240 -g1 -(g29 -g3 -Ntp241 -Rp242 -(dp243 -g8 -V002 -p244 -sg23 -VVP_ISA_F001_S003_I002 -p245 -sg35 -Vor rd, rs1, rs2\u000ard = rs1 | rs2\u000aNote: this is a bitwise, not logical operation -p246 -sg37 -VISA\u000aChapter 2.4 -p247 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p248 -sg41 -Visacov.rv32i_or_cg.cp_rd_value\u000aisacov.rv32i_or_cg.cp_rd_toggle -p249 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp250 -sg15 -(lp251 -sg53 -(lp252 -sg13 -(dp253 -g56 -I0 -ssbtp254 -asg86 -(lp255 -sg53 -(lp256 -sg13 -(dp257 -sbtp258 -a(V004_XOR -p259 -g1 -(g18 -g3 -Ntp260 -Rp261 -(dp262 -g22 -I3 -sg8 -g259 -sg23 -VVP_IP001_P004 -p263 -sg25 -(dp264 -sg12 -I4 -sg15 -(lp265 -(V000 -p266 -g1 -(g29 -g3 -Ntp267 -Rp268 -(dp269 -g8 -V000 -p270 -sg23 -VVP_ISA_F001_S004_I000 -p271 -sg35 -Vxor rd, rs1, rs2\u000ard = rs1 ^ rs2\u000aNote: this is a bitwise, not logical operation -p272 -sg37 -VISA\u000aChapter 2.4 -p273 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p274 -sg41 -Visacov.rv32i_xor_cg.cp_rs1\u000aisacov.rv32i_xor_cg.cp_rs2\u000aisacov.rv32i_xor_cg.cp_rd\u000aisacov.rv32i_xor_cg.rd_rs1_hazard\u000aisacov.rv32i_xor_cg.rd_rs2_hazard -p275 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp276 -sg15 -(lp277 -sg53 -(lp278 -sg13 -(dp279 -g56 -I0 -ssbtp280 -a(V001 -p281 -g1 -(g29 -g3 -Ntp282 -Rp283 -(dp284 -g8 -V001 -p285 -sg23 -VVP_ISA_F001_S004_I001 -p286 -sg35 -Vxor rd, rs1, rs2\u000ard = rs1 ^ rs2\u000aNote: this is a bitwise, not logical operation -p287 -sg37 -VISA\u000aChapter 2.4 -p288 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p289 -sg41 -Visacov.rv32i_xor_cg.cp_rs1_value\u000aisacov.rv32i_xor_cg.cp_rs2_value\u000aisacov.rv32i_xor_cg.cross_rs1_rs2_value\u000aisacov.rv32i_xor_cg.cp_rs1_toggle\u000aisacov.rv32i_xor_cg.cp_rs2_toggle -p290 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp291 -sg15 -(lp292 -sg53 -(lp293 -sg13 -(dp294 -g56 -I0 -ssbtp295 -a(V002 -p296 -g1 -(g29 -g3 -Ntp297 -Rp298 -(dp299 -g8 -V002 -p300 -sg23 -VVP_ISA_F001_S004_I002 -p301 -sg35 -Vxor rd, rs1, rs2\u000ard = rs1 ^ rs2\u000aNote: this is a bitwise, not logical operation -p302 -sg37 -VISA\u000aChapter 2.4 -p303 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p304 -sg41 -Visacov.rv32i_xor_cg.cp_rd_value\u000aisacov.rv32i_xor_cg.cp_rd_toggle -p305 -sg43 -I-1 -sg44 -I-1 -sg45 -I-1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp306 -sg15 -(lp307 -sg53 -(lp308 -sg13 -(dp309 -g56 -I0 -ssbtp310 -asg86 -(lp311 -sg53 -(lp312 -sg13 -(dp313 -sbtp314 -a(V005_SLT -p315 -g1 -(g18 -g3 -Ntp316 -Rp317 -(dp318 -g22 -I3 -sg8 -g315 -sg23 -VVP_IP001_P005 -p319 -sg25 -(dp320 -sg12 -I5 -sg15 -(lp321 -(V000 -p322 -g1 -(g29 -g3 -Ntp323 -Rp324 -(dp325 -g8 -V000 -p326 -sg23 -VVP_ISA_F001_S005_I000 -p327 -sg35 -Vslt rd, rs1, rs2\u000ard = (rs1 < rs2) ? 1 : 0\u000aBoth rs1 ad rs2 treated as signed numbers -p328 -sg37 -VISA\u000aChapter 2.4 -p329 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p330 -sg41 -Visacov.rv32i_slt_cg.cp_rs1\u000aisacov.rv32i_slt_cg.cp_rs2\u000aisacov.rv32i_slt_cg.cp_rd\u000aisacov.rv32i_slt_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_slt_cg.cp_rd_rs2_hazard -p331 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp332 -sg15 -(lp333 -sg53 -(lp334 -sg13 -(dp335 -g56 -I0 -ssbtp336 -a(V001 -p337 -g1 -(g29 -g3 -Ntp338 -Rp339 -(dp340 -g8 -V001 -p341 -sg23 -VVP_ISA_F001_S005_I001 -p342 -sg35 -Vslt rd, rs1, rs2\u000ard = (rs1 < rs2) ? 1 : 0\u000aBoth rs1 ad rs2 treated as signed numbers -p343 -sg37 -VISA\u000aChapter 2.4 -p344 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p345 -sg41 -Visacov.rv32i_slt_cg.cp_rs1_value\u000aisacov.rv32i_slt_cg.cp_rs2_value\u000aisacov.rv32i_slt_cg.cross_rs1_rs2_value\u000aisacov.rv32i_slt_cg.cp_rs1_toggle\u000aisacov.rv32i_slt_cg.cp_rs2_toggle -p346 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp347 -sg15 -(lp348 -sg53 -(lp349 -sg13 -(dp350 -g56 -I0 -ssbtp351 -a(V002 -p352 -g1 -(g29 -g3 -Ntp353 -Rp354 -(dp355 -g8 -V002 -p356 -sg23 -VVP_ISA_F001_S005_I002 -p357 -sg35 -Vslt rd, rs1, rs2\u000ard = (rs1 < rs2) ? 1 : 0\u000aBoth rs1 ad rs2 treated as signed numbers -p358 -sg37 -VISA\u000aChapter 2.4 -p359 -sg39 -VOutput result:\u000a\u000ard value is [0,1] -p360 -sg41 -Visacov.rv32i_slt_cg.cp_rd_value -p361 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp362 -sg15 -(lp363 -sg53 -(lp364 -sg13 -(dp365 -g56 -I0 -ssbtp366 -asg86 -(lp367 -sg53 -(lp368 -sg13 -(dp369 -sbtp370 -a(V006_SLTU -p371 -g1 -(g18 -g3 -Ntp372 -Rp373 -(dp374 -g22 -I3 -sg8 -g371 -sg23 -VVP_IP001_P006 -p375 -sg25 -(dp376 -sg12 -I6 -sg15 -(lp377 -(V000 -p378 -g1 -(g29 -g3 -Ntp379 -Rp380 -(dp381 -g8 -V000 -p382 -sg23 -VVP_ISA_F001_S006_I000 -p383 -sg35 -Vsltu rd, rs1, imm[11:0]\u000ard = (rs1 < rs2) ? 1 : 0\u000aBoth rs1 and rs2 treated as unsigned numbers -p384 -sg37 -VISA\u000aChapter 2.4 -p385 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p386 -sg41 -Visacov.rv32i_sltu_cg.cp_rs1\u000aisacov.rv32i_sltu_cg.cp_rs2\u000aisacov.rv32i_sltu_cg.cp_rd\u000aisacov.rv32i_sltu_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_sltu_cg.cp_rd_rs2_hazard -p387 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp388 -sg15 -(lp389 -sg53 -(lp390 -sg13 -(dp391 -g56 -I0 -ssbtp392 -a(V001 -p393 -g1 -(g29 -g3 -Ntp394 -Rp395 -(dp396 -g8 -V001 -p397 -sg23 -VVP_ISA_F001_S006_I001 -p398 -sg35 -Vsltu rd, rs1, imm[11:0]\u000ard = (rs1 < rs2) ? 1 : 0\u000aBoth rs1 and rs2 treated as unsigned numbers -p399 -sg37 -VISA\u000aChapter 2.4 -p400 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is non-zero and zero\u000aAll combinations of rs1 and rs2 non-zero and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p401 -sg41 -Visacov.rv32i_sltu_cg.cp_rs1_value\u000aisacov.rv32i_sltu_cg.cp_rs2_value\u000aisacov.rv32i_sltu_cg.cross_rs1_rs2_value\u000aisacov.rv32i_sltu_cg.cp_rs1_toggle\u000aisacov.rv32i_sltu_cg.cp_rs2_toggle -p402 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp403 -sg15 -(lp404 -sg53 -(lp405 -sg13 -(dp406 -g56 -I0 -ssbtp407 -a(V002 -p408 -g1 -(g29 -g3 -Ntp409 -Rp410 -(dp411 -g8 -V002 -p412 -sg23 -VVP_ISA_F001_S006_I002 -p413 -sg35 -Vsltu rd, rs1, imm[11:0]\u000ard = (rs1 < rs2) ? 1 : 0\u000aBoth rs1 and rs2 treated as unsigned numbers -p414 -sg37 -VISA\u000aChapter 2.4 -p415 -sg39 -VOutput result:\u000a\u000ard value is [0,1] -p416 -sg41 -Visacov.rv32i_sltu_cg.cp_rd_value -p417 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp418 -sg15 -(lp419 -sg53 -(lp420 -sg13 -(dp421 -g56 -I0 -ssbtp422 -asg86 -(lp423 -sg53 -(lp424 -sg13 -(dp425 -sbtp426 -a(V007_SLL -p427 -g1 -(g18 -g3 -Ntp428 -Rp429 -(dp430 -g22 -I3 -sg8 -g427 -sg23 -VVP_IP001_P007 -p431 -sg25 -(dp432 -sg12 -I7 -sg15 -(lp433 -(V000 -p434 -g1 -(g29 -g3 -Ntp435 -Rp436 -(dp437 -g8 -V000 -p438 -sg23 -VVP_ISA_F001_S007_I000 -p439 -sg35 -Vsll rd, rs1, rs2\u000ard = rs1 << rs2[4:0]\u000aZeros are shirfted into lower bits -p440 -sg37 -VISA\u000aChapter 2.4 -p441 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p442 -sg41 -Visacov.rv32i_sll_cg.cp_rs1\u000aisacov.rv32i_sll_cg.cp_rs2\u000aisacov.rv32i_sll_cg.cp_rd\u000aisacov.rv32i_sll_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_sll_cg.cp_rd_rs2_hazard -p443 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp444 -sg15 -(lp445 -sg53 -(lp446 -sg13 -(dp447 -g56 -I0 -ssbtp448 -a(V001 -p449 -g1 -(g29 -g3 -Ntp450 -Rp451 -(dp452 -g8 -V001 -p453 -sg23 -VVP_ISA_F001_S007_I001 -p454 -sg35 -Vsll rd, rs1, rs2\u000ard = rs1 << rs2[4:0]\u000aZeros are shirfted into lower bits -p455 -sg37 -VISA\u000aChapter 2.4 -p456 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is tested from [0,31]\u000aAll combinations of rs1 and rs2 non-zero and zero values with all shift values are used\u000aAll bits of rs1 are toggled -p457 -sg41 -Visacov.rv32i_sll_cg.cp_rs1_value\u000aisacov.rv32i_sll_cg.cp_rs2_value\u000aisacov.rv32i_sll_cg.cross_rs1_rs2_value\u000aisacov.rv32i_sll_cg.cp_rs1_toggle -p458 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp459 -sg15 -(lp460 -sg53 -(lp461 -sg13 -(dp462 -g56 -I0 -ssbtp463 -a(V002 -p464 -g1 -(g29 -g3 -Ntp465 -Rp466 -(dp467 -g8 -V002 -p468 -sg23 -VVP_ISA_F001_S007_I002 -p469 -sg35 -Vsll rd, rs1, rs2\u000ard = rs1 << rs2[4:0]\u000aZeros are shirfted into lower bits -p470 -sg37 -VISA\u000aChapter 2.4 -p471 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero.\u000aAll bits of rd are toggled -p472 -sg41 -Visacov.rv32i_sll_cg.cp_rd_value\u000aisacov.rv32i_sll_cg.cp_rd_toggle\u000aisacov.rv32i_sll_cg.cp_rd_value\u000aisacov.rv32i_sll_cg.cp_rd_toggle -p473 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp474 -sg15 -(lp475 -sg53 -(lp476 -sg13 -(dp477 -g56 -I0 -ssbtp478 -asg86 -(lp479 -sg53 -(lp480 -sg13 -(dp481 -sbtp482 -a(V008_SRL -p483 -g1 -(g18 -g3 -Ntp484 -Rp485 -(dp486 -g22 -I3 -sg8 -g483 -sg23 -VVP_IP001_P008 -p487 -sg25 -(dp488 -sg12 -I8 -sg15 -(lp489 -(V000 -p490 -g1 -(g29 -g3 -Ntp491 -Rp492 -(dp493 -g8 -V000 -p494 -sg23 -VVP_ISA_F001_S008_I000 -p495 -sg35 -Vsrl rd, rs1, rs2\u000ard = rs1 >> rs2[4:0]\u000aZeros are shirfted into upper bits -p496 -sg37 -VISA\u000aChapter 2.4 -p497 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p498 -sg41 -Visacov.rv32i_srl_cg.cp_rs1\u000aisacov.rv32i_srl_cg.cp_rs2\u000aisacov.rv32i_srl_cg.cp_rd\u000aisacov.rv32i_srl_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_srl_cg.cp_rd_rs2_hazard -p499 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp500 -sg15 -(lp501 -sg53 -(lp502 -sg13 -(dp503 -g56 -I0 -ssbtp504 -a(V001 -p505 -g1 -(g29 -g3 -Ntp506 -Rp507 -(dp508 -g8 -V001 -p509 -sg23 -VVP_ISA_F001_S008_I001 -p510 -sg35 -Vsrl rd, rs1, rs2\u000ard = rs1 >> rs2[4:0]\u000aZeros are shirfted into upper bits -p511 -sg37 -VISA\u000aChapter 2.4 -p512 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is tested from [0,31]\u000aAll combinations of rs1 and rs2 non-zero and zero values with all shift values are used\u000aAll bits of rs1 are toggled -p513 -sg41 -Visacov.rv32i_srl_cg.cp_rs1_value\u000aisacov.rv32i_srl_cg.cp_rs2_value\u000aisacov.rv32i_srl_cg.cross_rs1_rs2_value\u000aisacov.rv32i_srl_cg.cp_rs1_toggle -p514 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp515 -sg15 -(lp516 -sg53 -(lp517 -sg13 -(dp518 -g56 -I0 -ssbtp519 -a(V002 -p520 -g1 -(g29 -g3 -Ntp521 -Rp522 -(dp523 -g8 -V002 -p524 -sg23 -VVP_ISA_F001_S008_I002 -p525 -sg35 -Vsrl rd, rs1, rs2\u000ard = rs1 >> rs2[4:0]\u000aZeros are shirfted into upper bits -p526 -sg37 -VISA\u000aChapter 2.4 -p527 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero.\u000aAll bits of rd are toggled -p528 -sg41 -Visacov.rv32i_srl_cg.cp_rd_value\u000aisacov.rv32i_srl_cg.cp_rd_toggle -p529 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp530 -sg15 -(lp531 -sg53 -(lp532 -sg13 -(dp533 -g56 -I0 -ssbtp534 -asg86 -(lp535 -sg53 -(lp536 -sg13 -(dp537 -sbtp538 -a(V009_SRA -p539 -g1 -(g18 -g3 -Ntp540 -Rp541 -(dp542 -g22 -I3 -sg8 -g539 -sg23 -VVP_IP001_P009 -p543 -sg25 -(dp544 -sg12 -I9 -sg15 -(lp545 -(V000 -p546 -g1 -(g29 -g3 -Ntp547 -Rp548 -(dp549 -g8 -V000 -p550 -sg23 -VVP_ISA_F001_S009_I000 -p551 -sg35 -Vsra rd, rs1, rs2\u000ard = rs1 >> rs2[4:0]\u000aThe original sign bit is copied into the vacated upper bits -p552 -sg37 -VISA\u000aChapter 2.4 -p553 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p554 -sg41 -Visacov.rv32i_sra_cg.cp_rs1\u000aisacov.rv32i_sra_cg.cp_rs2\u000aisacov.rv32i_sra_cg.cp_rd\u000aisacov.rv32i_sra_cg.cp_rd_rs1_hazard\u000aisacov.rv32i_sra_cg.cp_rd_rs2_hazard -p555 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp556 -sg15 -(lp557 -sg53 -(lp558 -sg13 -(dp559 -g56 -I0 -ssbtp560 -a(V001 -p561 -g1 -(g29 -g3 -Ntp562 -Rp563 -(dp564 -g8 -V001 -p565 -sg23 -VVP_ISA_F001_S009_I001 -p566 -sg35 -Vsra rd, rs1, rs2\u000ard = rs1 >> rs2[4:0]\u000aThe original sign bit is copied into the vacated upper bits -p567 -sg37 -VISA\u000aChapter 2.4 -p568 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve, and zero\u000ars2 value is tested from [0,31]\u000aAll combinations of rs1 and rs2 +ve, -ve and zero values with all shift values are used\u000aAll bits of rs1 are toggled -p569 -sg41 -Visacov.rv32i_sra_cg.cp_rs1_value\u000aisacov.rv32i_sra_cg.cp_rs2_value\u000aisacov.rv32i_sra_cg.cross_rs1_rs2_value\u000aisacov.rv32i_sra_cg.cp_rs1_toggle -p570 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp571 -sg15 -(lp572 -sg53 -(lp573 -sg13 -(dp574 -g56 -I0 -ssbtp575 -a(V002 -p576 -g1 -(g29 -g3 -Ntp577 -Rp578 -(dp579 -g8 -V002 -p580 -sg23 -VVP_ISA_F001_S009_I002 -p581 -sg35 -Vsra rd, rs1, rs2\u000ard = rs1 >> rs2[4:0]\u000aZeros are shirfted into upper bits -p582 -sg37 -VISA\u000aChapter 2.4 -p583 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve, and zero.\u000aAll bits of rd are toggled -p584 -sg41 -Visacov.rv32i_sra_cg.cp_rd_value\u000aisacov.rv32i_sra_cg.cp_rd_toggle -p585 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp586 -sg15 -(lp587 -sg53 -(lp588 -sg13 -(dp589 -g56 -I0 -ssbtp590 -asg86 -(lp591 -sg53 -(lp592 -sg13 -(dp593 -sbtp594 -asVrfu_list_0 -p595 -(lp596 -sg86 -(lp597 -sVvptool_gitrev -p598 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p599 -sVio_fmt_gitrev -p600 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p601 -sVconfig_gitrev -p602 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p603 -sVymlcfg_gitrev -p604 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p605 -sbtp606 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml new file mode 100644 index 000000000..81184060b --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml @@ -0,0 +1,665 @@ +!Feature +next_elt_id: 10 +name: RV32I Register-Register Instructions +id: 1 +display_order: 1 +subfeatures: !!omap +- 000_ADD: !Subfeature + name: 000_ADD + tag: VP_IP001_P000 + next_elt_id: 4 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S000_I000 + description: "add rd, rs1, rs2\nrd = rs1 + rs2\nArithmetic overflow is lost\ + \ and ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_add_cg.cp_rs1\nisacov.rv32i_add_cg.cp_rs2\nisacov.rv32i_add_cg.cp_rd\n\ + isacov.rv32i_add_cg.cp_rd_rs1_hazard\nisacov.rv32i_add_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S000_I001 + description: "add rd, rs1, rs2\nrd = rs1 + rs2\nArithmetic overflow is lost\ + \ and ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_add_cg.cp_rs1_value\nisacov.rv32i_add_cg.cp_rs2_value\n\ + isacov.rv32i_add_cg.cross_rs1_rs2_value\nisacov.rv32i_add_cg.cp_rs1_toggle\n\ + isacov.rv32i_add_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S000_I002 + description: "add rd, rs1, rs2\nrd = rs1 + rs2\nArithmetic overflow is lost\ + \ and ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_add_cg.cp_rd_value\nisacov.rv32i_add_cg.cp_rd_toggle" + comments: '' +- 001_SUB: !Subfeature + name: 001_SUB + tag: VP_IP001_P001 + next_elt_id: 3 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S001_I000 + description: "sub rd, rs1, rs2\nrd = rs1 - rs2\nArithmetic underflow is ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sub_cg.cp_rs1\nisacov.rv32i_sub_cg.cp_rs2\nisacov.rv32i_sub_cg.cp_rd\n\ + isacov.rv32i_sub_cg.cp_rd_rs1_hazard\nisacov.rv32i_sub_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S001_I001 + description: "sub rd, rs1, rs2\nrd = rs1 - rs2\nArithmetic underflow is ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sub_cg.cp_rs1_value\nisacov.rv32i_sub_cg.cp_rs2_value\n\ + isacov.rv32i_sub_cg.cross_rs1_rs2_value\nisacov.rv32i_sub_cg.cp_rs1_toggle\n\ + isacov.rv32i_sub_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S001_I002 + description: "sub rd, rs1, rs2\nrd = rs1 - rs2\nArithmetic underflow is ignored" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sub_cg.cp_rd_value\nisacov.rv32i_sub_cg.cp_rd_toggle" + comments: '' +- 002_AND: !Subfeature + name: 002_AND + tag: VP_IP001_P002 + next_elt_id: 3 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S002_I000 + description: "and rd, rs1, rs2\nrd = rs1 & rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_and_cg.cp_rs1\nisacov.rv32i_and_cg.cp_rs2\nisacov.rv32i_and_cg.cp_rd\n\ + isacov.rv32i_and_cg.cp_rd_rs1_hazard\nisacov.rv32i_and_cg.cp_rd_rs2_hazard\n\ + isacov.rv32i_and_cg.cp_rs1\nisacov.rv32i_and_cg.cp_rs2\nisacov.rv32i_and_cg.cp_rd\n\ + isacov.rv32i_and_cg.cp_rd_rs1_hazard\nisacov.rv32i_and_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S002_I001 + description: "and rd, rs1, rs2\nrd = rs1 & rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_and_cg.cp_rs1_value\nisacov.rv32i_and_cg.cp_rs2_value\n\ + isacov.rv32i_and_cg.cross_rs1_rs2_value\nisacov.rv32i_and_cg.cp_rs1_toggle\n\ + isacov.rv32i_and_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S002_I002 + description: "and rd, rs1, rs2\nrd = rs1 & rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_and_cg.cp_rd_value\nisacov.rv32i_and_cg.cp_rd_toggle" + comments: '' +- 003_OR: !Subfeature + name: 003_OR + tag: VP_IP001_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S003_I000 + description: "or rd, rs1, rs2\nrd = rs1 | rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_or_cg.cp_rs1\nisacov.rv32i_or_cg.cp_rs2\nisacov.rv32i_or_cg.cp_rd\n\ + isacov.rv32i_or_cg.cp_rd_rs1_hazard\nisacov.rv32i_or_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S003_I001 + description: "or rd, rs1, rs2\nrd = rs1 | rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_or_cg.cp_rs1_value\nisacov.rv32i_or_cg.cp_rs2_value\n\ + isacov.rv32i_or_cg.cross_rs1_rs2_value\nisacov.rv32i_or_cg.cp_rs1_toggle\n\ + isacov.rv32i_or_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S003_I002 + description: "or rd, rs1, rs2\nrd = rs1 | rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_or_cg.cp_rd_value\nisacov.rv32i_or_cg.cp_rd_toggle" + comments: '' +- 004_XOR: !Subfeature + name: 004_XOR + tag: VP_IP001_P004 + next_elt_id: 3 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S004_I000 + description: "xor rd, rs1, rs2\nrd = rs1 ^ rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_xor_cg.cp_rs1\nisacov.rv32i_xor_cg.cp_rs2\nisacov.rv32i_xor_cg.cp_rd\n\ + isacov.rv32i_xor_cg.rd_rs1_hazard\nisacov.rv32i_xor_cg.rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S004_I001 + description: "xor rd, rs1, rs2\nrd = rs1 ^ rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_xor_cg.cp_rs1_value\nisacov.rv32i_xor_cg.cp_rs2_value\n\ + isacov.rv32i_xor_cg.cross_rs1_rs2_value\nisacov.rv32i_xor_cg.cp_rs1_toggle\n\ + isacov.rv32i_xor_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S004_I002 + description: "xor rd, rs1, rs2\nrd = rs1 ^ rs2\nNote: this is a bitwise, not\ + \ logical operation" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: -1 + test_type: -1 + cov_method: -1 + cores: 56 + coverage_loc: "isacov.rv32i_xor_cg.cp_rd_value\nisacov.rv32i_xor_cg.cp_rd_toggle" + comments: '' +- 005_SLT: !Subfeature + name: 005_SLT + tag: VP_IP001_P005 + next_elt_id: 3 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S005_I000 + description: "slt rd, rs1, rs2\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1 ad rs2\ + \ treated as signed numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slt_cg.cp_rs1\nisacov.rv32i_slt_cg.cp_rs2\nisacov.rv32i_slt_cg.cp_rd\n\ + isacov.rv32i_slt_cg.cp_rd_rs1_hazard\nisacov.rv32i_slt_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S005_I001 + description: "slt rd, rs1, rs2\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1 ad rs2\ + \ treated as signed numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_slt_cg.cp_rs1_value\nisacov.rv32i_slt_cg.cp_rs2_value\n\ + isacov.rv32i_slt_cg.cross_rs1_rs2_value\nisacov.rv32i_slt_cg.cp_rs1_toggle\n\ + isacov.rv32i_slt_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S005_I002 + description: "slt rd, rs1, rs2\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1 ad rs2\ + \ treated as signed numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is [0,1]" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_slt_cg.cp_rd_value + comments: '' +- 006_SLTU: !Subfeature + name: 006_SLTU + tag: VP_IP001_P006 + next_elt_id: 3 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S006_I000 + description: "sltu rd, rs1, imm[11:0]\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1\ + \ and rs2 treated as unsigned numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sltu_cg.cp_rs1\nisacov.rv32i_sltu_cg.cp_rs2\n\ + isacov.rv32i_sltu_cg.cp_rd\nisacov.rv32i_sltu_cg.cp_rd_rs1_hazard\nisacov.rv32i_sltu_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S006_I001 + description: "sltu rd, rs1, imm[11:0]\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1\ + \ and rs2 treated as unsigned numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is non-zero and zero\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sltu_cg.cp_rs1_value\nisacov.rv32i_sltu_cg.cp_rs2_value\n\ + isacov.rv32i_sltu_cg.cross_rs1_rs2_value\nisacov.rv32i_sltu_cg.cp_rs1_toggle\n\ + isacov.rv32i_sltu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S006_I002 + description: "sltu rd, rs1, imm[11:0]\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1\ + \ and rs2 treated as unsigned numbers" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is [0,1]" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_sltu_cg.cp_rd_value + comments: '' +- 007_SLL: !Subfeature + name: 007_SLL + tag: VP_IP001_P007 + next_elt_id: 3 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S007_I000 + description: "sll rd, rs1, rs2\nrd = rs1 << rs2[4:0]\nZeros are shirfted into\ + \ lower bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sll_cg.cp_rs1\nisacov.rv32i_sll_cg.cp_rs2\nisacov.rv32i_sll_cg.cp_rd\n\ + isacov.rv32i_sll_cg.cp_rd_rs1_hazard\nisacov.rv32i_sll_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S007_I001 + description: "sll rd, rs1, rs2\nrd = rs1 << rs2[4:0]\nZeros are shirfted into\ + \ lower bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is tested from [0,31]\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values with all shift values are used\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sll_cg.cp_rs1_value\nisacov.rv32i_sll_cg.cp_rs2_value\n\ + isacov.rv32i_sll_cg.cross_rs1_rs2_value\nisacov.rv32i_sll_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S007_I002 + description: "sll rd, rs1, rs2\nrd = rs1 << rs2[4:0]\nZeros are shirfted into\ + \ lower bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero.\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sll_cg.cp_rd_value\nisacov.rv32i_sll_cg.cp_rd_toggle\n\ + isacov.rv32i_sll_cg.cp_rd_value\nisacov.rv32i_sll_cg.cp_rd_toggle" + comments: '' +- 008_SRL: !Subfeature + name: 008_SRL + tag: VP_IP001_P008 + next_elt_id: 3 + display_order: 8 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S008_I000 + description: "srl rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ + \ upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srl_cg.cp_rs1\nisacov.rv32i_srl_cg.cp_rs2\nisacov.rv32i_srl_cg.cp_rd\n\ + isacov.rv32i_srl_cg.cp_rd_rs1_hazard\nisacov.rv32i_srl_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S008_I001 + description: "srl rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ + \ upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is tested from [0,31]\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values with all shift values are used\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srl_cg.cp_rs1_value\nisacov.rv32i_srl_cg.cp_rs2_value\n\ + isacov.rv32i_srl_cg.cross_rs1_rs2_value\nisacov.rv32i_srl_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S008_I002 + description: "srl rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ + \ upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero.\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_srl_cg.cp_rd_value\nisacov.rv32i_srl_cg.cp_rd_toggle" + comments: '' +- 009_SRA: !Subfeature + name: 009_SRA + tag: VP_IP001_P009 + next_elt_id: 3 + display_order: 9 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F001_S009_I000 + description: "sra rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nThe original sign bit\ + \ is copied into the vacated upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sra_cg.cp_rs1\nisacov.rv32i_sra_cg.cp_rs2\nisacov.rv32i_sra_cg.cp_rd\n\ + isacov.rv32i_sra_cg.cp_rd_rs1_hazard\nisacov.rv32i_sra_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F001_S009_I001 + description: "sra rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nThe original sign bit\ + \ is copied into the vacated upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve, and zero\nrs2 value\ + \ is tested from [0,31]\nAll combinations of rs1 and rs2 +ve, -ve and zero\ + \ values with all shift values are used\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sra_cg.cp_rs1_value\nisacov.rv32i_sra_cg.cp_rs2_value\n\ + isacov.rv32i_sra_cg.cross_rs1_rs2_value\nisacov.rv32i_sra_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F001_S009_I002 + description: "sra rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ + \ upper bits" + reqt_doc: "ISA\nChapter 2.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve, and zero.\nAll bits\ + \ of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sra_cg.cp_rd_value\nisacov.rv32i_sra_cg.cp_rd_toggle" + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.pck deleted file mode 100644 index e2b333919..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.pck +++ /dev/null @@ -1,1478 +0,0 @@ -(VRV32I Control Transfer Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I8 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I2 -sVwid_order -p12 -I2 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_JAL -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I3 -sg8 -g17 -sVtag -p23 -VVP_IP002_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F002_S000_I000 -p34 -sVdescription -p35 -Vjal rd, imm[20:1]\u000ard = pc+4; pc += Sext({imm[20:1], 1\u2019b0})\u000apc is calculated using signed arithmetic\u000a\u000ajal x0, imm[20:1] (special case: unconditional jump)\u000apc += Sext({imm[20:1], 1\u2019b0}) -p36 -sVpurpose -p37 -VISA\u000aChapter 2.5 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p40 -sVcoverage_loc -p41 -Visacov.rv32i_jal_cg.cp_rd -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -V001 -p62 -sg23 -VVP_ISA_F002_S000_I001 -p63 -sg35 -Vjal rd, imm[20:1]\u000ard = pc+4; pc += Sext({imm[20:1], 1\u2019b0})\u000apc is calculated using signed arithmetic\u000a\u000ajal x0, imm[20:1] (special case: unconditional jump)\u000apc += Sext({imm[20:1], 1\u2019b0}) -p64 -sg37 -VISA\u000aChapter 2.5 -p65 -sg39 -VInput operands:\u000a\u000aimmj value is +ve, -ve, and zero\u000aAll bits of immj are toggled -p66 -sg41 -Visacov.rv32i_jal_cg.cp_immj_value\u000aisacov.rv32i_jal_cg.cp_immj_toggle -p67 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp68 -sg15 -(lp69 -sg53 -(lp70 -sg13 -(dp71 -g56 -I0 -ssbtp72 -a(V002 -p73 -g1 -(g29 -g3 -Ntp74 -Rp75 -(dp76 -g8 -V002 -p77 -sg23 -VVP_ISA_F002_S000_I002 -p78 -sg35 -Vjal rd, imm[20:1]\u000ard = pc+4; pc += Sext({imm[20:1], 1\u2019b0})\u000apc is calculated using signed arithmetic\u000a\u000ajal x0, imm[20:1] (special case: unconditional jump)\u000apc += Sext({imm[20:1], 1\u2019b0}) -p79 -sg37 -VISA\u000aChapter 2.5 -p80 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p81 -sg41 -Visacov.rv32i_jal_cg.cp_rd_toggle -p82 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp83 -sg15 -(lp84 -sg53 -(lp85 -sg13 -(dp86 -g56 -I0 -ssbtp87 -asVrfu_list_1 -p88 -(lp89 -sg53 -(lp90 -sg13 -(dp91 -sbtp92 -a(V001_JALR -p93 -g1 -(g18 -g3 -Ntp94 -Rp95 -(dp96 -g22 -I3 -sg8 -g93 -sg23 -VVP_IP002_P001 -p97 -sg25 -(dp98 -sg12 -I1 -sg15 -(lp99 -(V000 -p100 -g1 -(g29 -g3 -Ntp101 -Rp102 -(dp103 -g8 -V000 -p104 -sg23 -VVP_ISA_F002_S001_I000 -p105 -sg35 -Vjalr rd, rs1, imm[11:0]\u000ard = pc+4; pc = rs1 + Sext(imm[11:0])\u000apc is calculated using signed arithmetic -p106 -sg37 -VISA\u000aChapter 2.5 -p107 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p108 -sg41 -Visacov.rv32i_jalr_cg.cp_rs1\u000aisacov.rv32i_jalr_cg.cp_rd\u000aisacov.rv32i_jalr_cg.cp_rd_rs1_hazard -p109 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp110 -sg15 -(lp111 -sg53 -(lp112 -sg13 -(dp113 -g56 -I0 -ssbtp114 -a(V001 -p115 -g1 -(g29 -g3 -Ntp116 -Rp117 -(dp118 -g8 -V001 -p119 -sg23 -VVP_ISA_F002_S001_I001 -p120 -sg35 -Vjalr rd, rs1, imm[11:0]\u000ard = pc+4; pc = rs1 + Sext(imm[11:0])\u000apc is calculated using signed arithmetic -p121 -sg37 -VISA\u000aChapter 2.5 -p122 -sg39 -VInput operands:\u000a\u000aimmi value is +ve, -ve, and zero\u000aAll bits of immi are toggled\u000aAll bits of rs1 are toggled -p123 -sg41 -Visacov.rv32i_jalr_cg.cp_immi_value\u000aisacov.rv32i_jalr_cg.cp_immi_toggle\u000aisacov.rv32i_jalr_cg.cp_rs1_toggle -p124 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp125 -sg15 -(lp126 -sg53 -(lp127 -sg13 -(dp128 -g56 -I0 -ssbtp129 -a(V002 -p130 -g1 -(g29 -g3 -Ntp131 -Rp132 -(dp133 -g8 -V002 -p134 -sg23 -VVP_ISA_F002_S001_I002 -p135 -sg35 -Vjalr rd, rs1, imm[11:0]\u000ard = pc+4; pc = rs1 + Sext(imm[11:0])\u000apc is calculated using signed arithmetic -p136 -sg37 -VISA\u000aChapter 2.5 -p137 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p138 -sg41 -Visacov.rv32i_jalr_cg.cp_rd_toggle -p139 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp140 -sg15 -(lp141 -sg53 -(lp142 -sg13 -(dp143 -g56 -I0 -ssbtp144 -asg88 -(lp145 -sg53 -(lp146 -sg13 -(dp147 -sbtp148 -a(V002_BEQ -p149 -g1 -(g18 -g3 -Ntp150 -Rp151 -(dp152 -g22 -I3 -sg8 -g149 -sg23 -VVP_IP002_P002 -p153 -sg25 -(dp154 -sg12 -I2 -sg15 -(lp155 -(V000 -p156 -g1 -(g29 -g3 -Ntp157 -Rp158 -(dp159 -g8 -V000 -p160 -sg23 -VVP_ISA_F002_S002_I000 -p161 -sg35 -Vbeq rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1==rs2) else pc += 4\u000apc is calculated using signed arithmetic -p162 -sg37 -VISA\u000aChapter 2.5 -p163 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p164 -sg41 -Visacov.rv32i_beq_cg.cp_rs1\u000aisacov.rv32i_beq_cg.cp_rs2 -p165 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp166 -sg15 -(lp167 -sg53 -(lp168 -sg13 -(dp169 -g56 -I0 -ssbtp170 -a(V001 -p171 -g1 -(g29 -g3 -Ntp172 -Rp173 -(dp174 -g8 -V001 -p175 -sg23 -VVP_ISA_F002_S002_I001 -p176 -sg35 -Vbeq rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1==rs2) else pc += 4\u000apc is calculated using signed arithmetic -p177 -sg37 -VISA\u000aChapter 2.5 -p178 -sg39 -VInput operands:\u000a\u000aimmb value is +ve, -ve, and zero\u000aAll bits of immb are toggled\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p179 -sg41 -Visacov.rv32i_beq_cg.cp_immb_value\u000aisacov.rv32i_beq_cg.cp_rs1_toggle\u000aisacov.rv32i_beq_cg.cp_rs2_toggle -p180 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp181 -sg15 -(lp182 -sg53 -(lp183 -sg13 -(dp184 -g56 -I0 -ssbtp185 -a(V002 -p186 -g1 -(g29 -g3 -Ntp187 -Rp188 -(dp189 -g8 -V002 -p190 -sg23 -VVP_ISA_F002_S002_I002 -p191 -sg35 -Vbeq rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1==rs2) else pc += 4\u000apc is calculated using signed arithmetic -p192 -sg37 -VISA\u000aChapter 2.5 -p193 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p194 -sg41 -Visacov.rv32i_beq_cg.cp_branch_taken -p195 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp196 -sg15 -(lp197 -sg53 -(lp198 -sg13 -(dp199 -g56 -I0 -ssbtp200 -asg88 -(lp201 -sg53 -(lp202 -sg13 -(dp203 -sbtp204 -a(V003_BNE -p205 -g1 -(g18 -g3 -Ntp206 -Rp207 -(dp208 -g22 -I3 -sg8 -g205 -sg23 -VVP_IP002_P003 -p209 -sg25 -(dp210 -sg12 -I3 -sg15 -(lp211 -(V000 -p212 -g1 -(g29 -g3 -Ntp213 -Rp214 -(dp215 -g8 -V000 -p216 -sg23 -VVP_ISA_F002_S003_I000 -p217 -sg35 -Vbne rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1!=rs2) else pc += 4\u000apc is calculated using signed arithmetic -p218 -sg37 -VISA\u000aChapter 2.5 -p219 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p220 -sg41 -Visacov.rv32i_bne_cg.cp_rs1\u000aisacov.rv32i_bne_cg.cp_rs2 -p221 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp222 -sg15 -(lp223 -sg53 -(lp224 -sg13 -(dp225 -g56 -I0 -ssbtp226 -a(V001 -p227 -g1 -(g29 -g3 -Ntp228 -Rp229 -(dp230 -g8 -V001 -p231 -sg23 -VVP_ISA_F002_S003_I001 -p232 -sg35 -Vbne rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1!=rs2) else pc += 4\u000apc is calculated using signed arithmetic -p233 -sg37 -VISA\u000aChapter 2.5 -p234 -sg39 -VInput operands:\u000a\u000aimmb value is +ve, -ve, and zero\u000aAll bits of immb are toggled\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p235 -sg41 -Visacov.rv32i_bne_cg.cp_immb_value\u000aisacov.rv32i_bne_cg.cp_rs1_toggle\u000aisacov.rv32i_bne_cg.cp_rs2_toggle -p236 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp237 -sg15 -(lp238 -sg53 -(lp239 -sg13 -(dp240 -g56 -I0 -ssbtp241 -a(V002 -p242 -g1 -(g29 -g3 -Ntp243 -Rp244 -(dp245 -g8 -V002 -p246 -sg23 -VVP_ISA_F002_S003_I002 -p247 -sg35 -Vbne rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1!=rs2) else pc += 4\u000apc is calculated using signed arithmetic -p248 -sg37 -VISA\u000aChapter 2.5 -p249 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p250 -sg41 -Visacov.rv32i_bne_cg.cp_branch_taken -p251 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp252 -sg15 -(lp253 -sg53 -(lp254 -sg13 -(dp255 -g56 -I0 -ssbtp256 -asg88 -(lp257 -sg53 -(lp258 -sg13 -(dp259 -sbtp260 -a(V004_BLT -p261 -g1 -(g18 -g3 -Ntp262 -Rp263 -(dp264 -g22 -I3 -sg8 -g261 -sg23 -VVP_IP002_P004 -p265 -sg25 -(dp266 -sg12 -I4 -sg15 -(lp267 -(V000 -p268 -g1 -(g29 -g3 -Ntp269 -Rp270 -(dp271 -g8 -V000 -p272 -sg23 -VVP_ISA_F002_S004_I000 -p273 -sg35 -Vblt rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 < rs2) else pc += 4\u000apc is calculated using signed arithmetic -p274 -sg37 -VISA\u000aChapter 2.5 -p275 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p276 -sg41 -Visacov.rv32i_blt_cg.cp_rs1\u000aisacov.rv32i_blt_cg.cp_rs2 -p277 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp278 -sg15 -(lp279 -sg53 -(lp280 -sg13 -(dp281 -g56 -I0 -ssbtp282 -a(V001 -p283 -g1 -(g29 -g3 -Ntp284 -Rp285 -(dp286 -g8 -V001 -p287 -sg23 -VVP_ISA_F002_S004_I001 -p288 -sg35 -Vblt rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 < rs2) else pc += 4\u000apc is calculated using signed arithmetic -p289 -sg37 -VISA\u000aChapter 2.5 -p290 -sg39 -VInput operands:\u000a\u000aimmb value is +ve, -ve, and zero\u000aAll bits of immb are toggled\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p291 -sg41 -Visacov.rv32i_blt_cg.cp_immb_value\u000aisacov.rv32i_blt_cg.cp_rs1_toggle\u000aisacov.rv32i_blt_cg.cp_rs2_toggle -p292 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp293 -sg15 -(lp294 -sg53 -(lp295 -sg13 -(dp296 -g56 -I0 -ssbtp297 -a(V002 -p298 -g1 -(g29 -g3 -Ntp299 -Rp300 -(dp301 -g8 -V002 -p302 -sg23 -VVP_ISA_F002_S004_I002 -p303 -sg35 -Vblt rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 < rs2) else pc += 4\u000apc is calculated using signed arithmetic -p304 -sg37 -VISA\u000aChapter 2.5 -p305 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p306 -sg41 -Visacov.rv32i_blt_cg.cp_branch_taken -p307 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp308 -sg15 -(lp309 -sg53 -(lp310 -sg13 -(dp311 -g56 -I0 -ssbtp312 -asg88 -(lp313 -sg53 -(lp314 -sg13 -(dp315 -sbtp316 -a(V005_BGE -p317 -g1 -(g18 -g3 -Ntp318 -Rp319 -(dp320 -g22 -I6 -sg8 -g317 -sg23 -VVP_IP002_P005 -p321 -sg25 -(dp322 -sg12 -I5 -sg15 -(lp323 -(V000 -p324 -g1 -(g29 -g3 -Ntp325 -Rp326 -(dp327 -g8 -V000 -p328 -sg23 -VVP_ISA_F002_S005_I000 -p329 -sg35 -Vbge rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 >= rs2) else pc += 4\u000apc is calculated using signed arithmetic -p330 -sg37 -VISA\u000aChapter 2.5 -p331 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p332 -sg41 -Visacov.rv32i_bge_cg.cp_rs1\u000aisacov.rv32i_bge_cg.cp_rs2 -p333 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp334 -sg15 -(lp335 -sg53 -(lp336 -sg13 -(dp337 -g56 -I0 -ssbtp338 -a(V001 -p339 -g1 -(g29 -g3 -Ntp340 -Rp341 -(dp342 -g8 -g339 -sg23 -VVP_ISA_F002_S005_I001 -p343 -sg35 -Vbge rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 >= rs2) else pc += 4\u000apc is calculated using signed arithmetic -p344 -sg37 -VISA\u000aChapter 2.5 -p345 -sg39 -VInput operands:\u000a\u000aimmb value is +ve, -ve, and zero\u000aAll bits of immb are toggled\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p346 -sg41 -Visacov.rv32i_bge_cg.cp_immb_value\u000aisacov.rv32i_bge_cg.cp_rs1_toggle\u000aisacov.rv32i_bge_cg.cp_rs2_toggle -p347 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp348 -sg15 -(lp349 -sg53 -(lp350 -sg13 -(dp351 -g56 -I0 -ssbtp352 -a(V002 -p353 -g1 -(g29 -g3 -Ntp354 -Rp355 -(dp356 -g8 -g353 -sg23 -VVP_ISA_F002_S005_I002 -p357 -sg35 -Vbge rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 >= rs2) else pc += 4\u000apc is calculated using signed arithmetic -p358 -sg37 -VISA\u000aChapter 2.5 -p359 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p360 -sg41 -Visacov.rv32i_bge_cg.cp_branch_taken -p361 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp362 -sg15 -(lp363 -sg53 -(lp364 -sg13 -(dp365 -g56 -I0 -ssbtp366 -asg88 -(lp367 -sg53 -(lp368 -sg13 -(dp369 -sbtp370 -a(V006_BLTU -p371 -g1 -(g18 -g3 -Ntp372 -Rp373 -(dp374 -g22 -I3 -sg8 -g371 -sg23 -VVP_IP002_P006 -p375 -sg25 -(dp376 -sg12 -I6 -sg15 -(lp377 -(V000 -p378 -g1 -(g29 -g3 -Ntp379 -Rp380 -(dp381 -g8 -V000 -p382 -sg23 -VVP_ISA_F002_S006_I000 -p383 -sg35 -Vbltu rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 < rs2) else pc += 4\u000apc is calculated using unsigned arithmetic -p384 -sg37 -VISA\u000aChapter 2.5 -p385 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p386 -sg41 -Visacov.rv32i_bltu_cg.cp_rs1\u000aisacov.rv32i_bltu_cg.cp_rs2 -p387 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp388 -sg15 -(lp389 -sg53 -(lp390 -sg13 -(dp391 -g56 -I0 -ssbtp392 -a(V001 -p393 -g1 -(g29 -g3 -Ntp394 -Rp395 -(dp396 -g8 -V001 -p397 -sg23 -VVP_ISA_F002_S006_I001 -p398 -sg35 -Vbltu rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 < rs2) else pc += 4\u000apc is calculated using unsigned arithmetic -p399 -sg37 -VISA\u000aChapter 2.5 -p400 -sg39 -VInput operands:\u000a\u000aimmb value is +ve, -ve, and zero\u000aAll bits of immb are toggled\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p401 -sg41 -Visacov.rv32i_bltu_cg.cp_immb_value\u000aisacov.rv32i_bltu_cg.cp_rs1_toggle\u000aisacov.rv32i_bltu_cg.cp_rs2_toggle -p402 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp403 -sg15 -(lp404 -sg53 -(lp405 -sg13 -(dp406 -g56 -I0 -ssbtp407 -a(V002 -p408 -g1 -(g29 -g3 -Ntp409 -Rp410 -(dp411 -g8 -V002 -p412 -sg23 -VVP_ISA_F002_S006_I002 -p413 -sg35 -Vbltu rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 < rs2) else pc += 4\u000apc is calculated using unsigned arithmetic -p414 -sg37 -VISA\u000aChapter 2.5 -p415 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p416 -sg41 -Visacov.rv32i_bltu_cg.cp_branch_taken -p417 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp418 -sg15 -(lp419 -sg53 -(lp420 -sg13 -(dp421 -g56 -I0 -ssbtp422 -asg88 -(lp423 -sg53 -(lp424 -sg13 -(dp425 -sbtp426 -a(V007_BGEU -p427 -g1 -(g18 -g3 -Ntp428 -Rp429 -(dp430 -g22 -I3 -sg8 -g427 -sg23 -VVP_IP002_P007 -p431 -sg25 -(dp432 -sg12 -I7 -sg15 -(lp433 -(V000 -p434 -g1 -(g29 -g3 -Ntp435 -Rp436 -(dp437 -g8 -V000 -p438 -sg23 -VVP_ISA_F002_S007_I000 -p439 -sg35 -Vbgeu rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 >= rs2) else pc += 4\u000apc is calculated using unsigned arithmetic -p440 -sg37 -VISA\u000aChapter 2.5 -p441 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p442 -sg41 -Visacov.rv32i_bgeu_cg.cp_rs1\u000aisacov.rv32i_bgeu_cg.cp_rs2 -p443 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp444 -sg15 -(lp445 -sg53 -(lp446 -sg13 -(dp447 -g56 -I0 -ssbtp448 -a(V001 -p449 -g1 -(g29 -g3 -Ntp450 -Rp451 -(dp452 -g8 -V001 -p453 -sg23 -VVP_ISA_F002_S007_I001 -p454 -sg35 -Vbgeu rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 >= rs2) else pc += 4\u000apc is calculated using unsigned arithmetic -p455 -sg37 -VISA\u000aChapter 2.5 -p456 -sg39 -VInput operands:\u000a\u000aimmb value is +ve, -ve, and zero\u000aAll bits of immb are toggled\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p457 -sg41 -Visacov.rv32i_bgeu_cg.cp_immb_value\u000aisacov.rv32i_bgeu_cg.cp_rs1_toggle\u000aisacov.rv32i_bgeu_cg.cp_rs2_toggle -p458 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp459 -sg15 -(lp460 -sg53 -(lp461 -sg13 -(dp462 -g56 -I0 -ssbtp463 -a(V002 -p464 -g1 -(g29 -g3 -Ntp465 -Rp466 -(dp467 -g8 -V002 -p468 -sg23 -VVP_ISA_F002_S007_I002 -p469 -sg35 -Vbgeu rs1, rs2, imm[12:1]\u000apc += Sext({imm[12:1], 1\u2019b0}) if (rs1 >= rs2) else pc += 4\u000apc is calculated using unsigned arithmetic -p470 -sg37 -VISA\u000aChapter 2.5 -p471 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p472 -sg41 -Visacov.rv32i_bgeu_cg.cp_branch_taken -p473 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp474 -sg15 -(lp475 -sg53 -(lp476 -sg13 -(dp477 -g56 -I0 -ssbtp478 -asg88 -(lp479 -sg53 -(lp480 -sg13 -(dp481 -sbtp482 -asVrfu_list_0 -p483 -(lp484 -sg88 -(lp485 -sVvptool_gitrev -p486 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p487 -sVio_fmt_gitrev -p488 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p489 -sVconfig_gitrev -p490 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p491 -sVymlcfg_gitrev -p492 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p493 -sbtp494 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml new file mode 100644 index 000000000..a6903df29 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml @@ -0,0 +1,498 @@ +!Feature +next_elt_id: 8 +name: RV32I Control Transfer Instructions +id: 2 +display_order: 2 +subfeatures: !!omap +- 000_JAL: !Subfeature + name: 000_JAL + tag: VP_IP002_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S000_I000 + description: "jal rd, imm[20:1]\nrd = pc+4; pc += Sext({imm[20:1], 1’b0})\n\ + pc is calculated using signed arithmetic\n\njal x0, imm[20:1] (special case:\ + \ unconditional jump)\npc += Sext({imm[20:1], 1’b0})" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_jal_cg.cp_rd + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S000_I001 + description: "jal rd, imm[20:1]\nrd = pc+4; pc += Sext({imm[20:1], 1’b0})\n\ + pc is calculated using signed arithmetic\n\njal x0, imm[20:1] (special case:\ + \ unconditional jump)\npc += Sext({imm[20:1], 1’b0})" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmj value is +ve, -ve, and zero\nAll bits\ + \ of immj are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_jal_cg.cp_immj_value\nisacov.rv32i_jal_cg.cp_immj_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S000_I002 + description: "jal rd, imm[20:1]\nrd = pc+4; pc += Sext({imm[20:1], 1’b0})\n\ + pc is calculated using signed arithmetic\n\njal x0, imm[20:1] (special case:\ + \ unconditional jump)\npc += Sext({imm[20:1], 1’b0})" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_jal_cg.cp_rd_toggle + comments: '' +- 001_JALR: !Subfeature + name: 001_JALR + tag: VP_IP002_P001 + next_elt_id: 3 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S001_I000 + description: "jalr rd, rs1, imm[11:0]\nrd = pc+4; pc = rs1 + Sext(imm[11:0])\n\ + pc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_jalr_cg.cp_rs1\nisacov.rv32i_jalr_cg.cp_rd\nisacov.rv32i_jalr_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S001_I001 + description: "jalr rd, rs1, imm[11:0]\nrd = pc+4; pc = rs1 + Sext(imm[11:0])\n\ + pc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmi value is +ve, -ve, and zero\nAll bits\ + \ of immi are toggled\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_jalr_cg.cp_immi_value\nisacov.rv32i_jalr_cg.cp_immi_toggle\n\ + isacov.rv32i_jalr_cg.cp_rs1_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S001_I002 + description: "jalr rd, rs1, imm[11:0]\nrd = pc+4; pc = rs1 + Sext(imm[11:0])\n\ + pc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_jalr_cg.cp_rd_toggle + comments: '' +- 002_BEQ: !Subfeature + name: 002_BEQ + tag: VP_IP002_P002 + next_elt_id: 3 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S002_I000 + description: "beq rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1==rs2)\ + \ else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_beq_cg.cp_rs1\nisacov.rv32i_beq_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S002_I001 + description: "beq rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1==rs2)\ + \ else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmb value is +ve, -ve, and zero\nAll bits\ + \ of immb are toggled\nAll bits of rs1 are toggled\nAll bits of rs2 are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_beq_cg.cp_immb_value\nisacov.rv32i_beq_cg.cp_rs1_toggle\n\ + isacov.rv32i_beq_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S002_I002 + description: "beq rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1==rs2)\ + \ else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_beq_cg.cp_branch_taken + comments: '' +- 003_BNE: !Subfeature + name: 003_BNE + tag: VP_IP002_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S003_I000 + description: "bne rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1!=rs2)\ + \ else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bne_cg.cp_rs1\nisacov.rv32i_bne_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S003_I001 + description: "bne rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1!=rs2)\ + \ else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmb value is +ve, -ve, and zero\nAll bits\ + \ of immb are toggled\nAll bits of rs1 are toggled\nAll bits of rs2 are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bne_cg.cp_immb_value\nisacov.rv32i_bne_cg.cp_rs1_toggle\n\ + isacov.rv32i_bne_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S003_I002 + description: "bne rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1!=rs2)\ + \ else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_bne_cg.cp_branch_taken + comments: '' +- 004_BLT: !Subfeature + name: 004_BLT + tag: VP_IP002_P004 + next_elt_id: 3 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S004_I000 + description: "blt rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ < rs2) else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_blt_cg.cp_rs1\nisacov.rv32i_blt_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S004_I001 + description: "blt rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ < rs2) else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmb value is +ve, -ve, and zero\nAll bits\ + \ of immb are toggled\nAll bits of rs1 are toggled\nAll bits of rs2 are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_blt_cg.cp_immb_value\nisacov.rv32i_blt_cg.cp_rs1_toggle\n\ + isacov.rv32i_blt_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S004_I002 + description: "blt rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ < rs2) else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_blt_cg.cp_branch_taken + comments: '' +- 005_BGE: !Subfeature + name: 005_BGE + tag: VP_IP002_P005 + next_elt_id: 6 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S005_I000 + description: "bge rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ >= rs2) else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bge_cg.cp_rs1\nisacov.rv32i_bge_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S005_I001 + description: "bge rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ >= rs2) else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmb value is +ve, -ve, and zero\nAll bits\ + \ of immb are toggled\nAll bits of rs1 are toggled\nAll bits of rs2 are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bge_cg.cp_immb_value\nisacov.rv32i_bge_cg.cp_rs1_toggle\n\ + isacov.rv32i_bge_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S005_I002 + description: "bge rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ >= rs2) else pc += 4\npc is calculated using signed arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_bge_cg.cp_branch_taken + comments: '' +- 006_BLTU: !Subfeature + name: 006_BLTU + tag: VP_IP002_P006 + next_elt_id: 3 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S006_I000 + description: "bltu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ < rs2) else pc += 4\npc is calculated using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bltu_cg.cp_rs1\nisacov.rv32i_bltu_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S006_I001 + description: "bltu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ < rs2) else pc += 4\npc is calculated using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmb value is +ve, -ve, and zero\nAll bits\ + \ of immb are toggled\nAll bits of rs1 are toggled\nAll bits of rs2 are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bltu_cg.cp_immb_value\nisacov.rv32i_bltu_cg.cp_rs1_toggle\n\ + isacov.rv32i_bltu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S006_I002 + description: "bltu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ < rs2) else pc += 4\npc is calculated using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_bltu_cg.cp_branch_taken + comments: '' +- 007_BGEU: !Subfeature + name: 007_BGEU + tag: VP_IP002_P007 + next_elt_id: 3 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F002_S007_I000 + description: "bgeu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ >= rs2) else pc += 4\npc is calculated using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bgeu_cg.cp_rs1\nisacov.rv32i_bgeu_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F002_S007_I001 + description: "bgeu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ >= rs2) else pc += 4\npc is calculated using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmb value is +ve, -ve, and zero\nAll bits\ + \ of immb are toggled\nAll bits of rs1 are toggled\nAll bits of rs2 are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_bgeu_cg.cp_immb_value\nisacov.rv32i_bgeu_cg.cp_rs1_toggle\n\ + isacov.rv32i_bgeu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F002_S007_I002 + description: "bgeu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ + \ >= rs2) else pc += 4\npc is calculated using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_bgeu_cg.cp_branch_taken + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.pck deleted file mode 100644 index bcd79324f..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.pck +++ /dev/null @@ -1,1333 +0,0 @@ -(VRV32I Load and Store Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I8 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I3 -sVwid_order -p12 -I3 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_LB -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I3 -sg8 -g17 -sVtag -p23 -VVP_IP003_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F003_S000_I000 -p34 -sVdescription -p35 -Vlb rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:7])\u000ard is calculated using signed arithmetic -p36 -sVpurpose -p37 -VISA\u000aChapter 2.6 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p40 -sVcoverage_loc -p41 -Visacov.rv32i_lb_cg.cp_rs1\u000aisacov.rv32i_lb_cg.cp_rd\u000aisacov.rv32i_lb_cg.cp_rd_rs1_hazard -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -V001 -p62 -sg23 -VVP_ISA_F003_S000_I001 -p63 -sg35 -Vlb rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:7])\u000ard is calculated using signed arithmetic -p64 -sg37 -VISA\u000aChapter 2.6 -p65 -sg39 -VInput operands:\u000a\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p66 -sg41 -Visacov.rv32i_lb_cg.cp_immi_value\u000aisacov.rv32i_lb_cg.cp_rs1_toggle\u000aisacov.rv32i_lb_cg.cp_immi_toggle -p67 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp68 -sg15 -(lp69 -sg53 -(lp70 -sg13 -(dp71 -g56 -I0 -ssbtp72 -a(V002 -p73 -g1 -(g29 -g3 -Ntp74 -Rp75 -(dp76 -g8 -V002 -p77 -sg23 -VVP_ISA_F003_S000_I002 -p78 -sg35 -Vlb rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:7])\u000ard is calculated using signed arithmetic -p79 -sg37 -VISA\u000aChapter 2.6 -p80 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p81 -sg41 -Visacov.rv32i_lb_cg.cp_rd_value\u000aisacov.rv32i_lb_cg.cp_rd_toggle -p82 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp83 -sg15 -(lp84 -sg53 -(lp85 -sg13 -(dp86 -g56 -I0 -ssbtp87 -asVrfu_list_1 -p88 -(lp89 -sg53 -(lp90 -sg13 -(dp91 -sbtp92 -a(V001_LH -p93 -g1 -(g18 -g3 -Ntp94 -Rp95 -(dp96 -g22 -I3 -sg8 -g93 -sg23 -VVP_IP003_P001 -p97 -sg25 -(dp98 -sg12 -I1 -sg15 -(lp99 -(V000 -p100 -g1 -(g29 -g3 -Ntp101 -Rp102 -(dp103 -g8 -V000 -p104 -sg23 -VVP_ISA_F003_S001_I000 -p105 -sg35 -Vlh rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:15])\u000ard is calculated using signed arithmetic -p106 -sg37 -VISA\u000aChapter 2.6 -p107 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p108 -sg41 -Visacov.rv32i_lh_cg.cp_rs1\u000aisacov.rv32i_lh_cg.cp_rd\u000aisacov.rv32i_lh_cg.cp_rd_rs1_hazard -p109 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp110 -sg15 -(lp111 -sg53 -(lp112 -sg13 -(dp113 -g56 -I0 -ssbtp114 -a(V001 -p115 -g1 -(g29 -g3 -Ntp116 -Rp117 -(dp118 -g8 -V001 -p119 -sg23 -VVP_ISA_F003_S001_I001 -p120 -sg35 -Vlh rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:15])\u000ard is calculated using signed arithmetic -p121 -sg37 -VISA\u000aChapter 2.6 -p122 -sg39 -VInput operands:\u000a\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled\u000aUnaligned and aligned accesses from memory -p123 -sg41 -Visacov.rv32i_lh_cg.cp_immi_value\u000aisacov.rv32i_lh_cg.cp_rs1_toggle\u000aisacov.rv32i_lh_cg.cp_immi_toggle\u000aisacov.rv32i_lh_cg.cp_aligned -p124 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp125 -sg15 -(lp126 -sg53 -(lp127 -sg13 -(dp128 -g56 -I0 -ssbtp129 -a(V002 -p130 -g1 -(g29 -g3 -Ntp131 -Rp132 -(dp133 -g8 -V002 -p134 -sg23 -VVP_ISA_F003_S001_I002 -p135 -sg35 -Vlh rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:15])\u000ard is calculated using signed arithmetic -p136 -sg37 -VISA\u000aChapter 2.6 -p137 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p138 -sg41 -Visacov.rv32i_lh_cg.cp_rd_value\u000aisacov.rv32i_lh_cg.cp_rd_toggle -p139 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp140 -sg15 -(lp141 -sg53 -(lp142 -sg13 -(dp143 -g56 -I0 -ssbtp144 -asg88 -(lp145 -sg53 -(lp146 -sg13 -(dp147 -sbtp148 -a(V002_LW -p149 -g1 -(g18 -g3 -Ntp150 -Rp151 -(dp152 -g22 -I3 -sg8 -g149 -sg23 -VVP_IP003_P002 -p153 -sg25 -(dp154 -sg12 -I2 -sg15 -(lp155 -(V000 -p156 -g1 -(g29 -g3 -Ntp157 -Rp158 -(dp159 -g8 -V000 -p160 -sg23 -VVP_ISA_F003_S002_I000 -p161 -sg35 -Vlw rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:31])\u000ard is calculated using signed arithmetic -p162 -sg37 -VISA\u000aChapter 2.6 -p163 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p164 -sg41 -Visacov.rv32i_lw_cg.cp_rs1\u000aisacov.rv32i_lw_cg.cp_rd\u000aisacov.rv32i_lw_cg.cp_rd_rs1_hazard -p165 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp166 -sg15 -(lp167 -sg53 -(lp168 -sg13 -(dp169 -g56 -I0 -ssbtp170 -a(V001 -p171 -g1 -(g29 -g3 -Ntp172 -Rp173 -(dp174 -g8 -V001 -p175 -sg23 -VVP_ISA_F003_S002_I001 -p176 -sg35 -Vlw rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:31])\u000ard is calculated using signed arithmetic -p177 -sg37 -VISA\u000aChapter 2.6 -p178 -sg39 -VInput operands:\u000a\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled\u000aUnaligned and aligned accesses from memory -p179 -sg41 -Visacov.rv32i_lw_cg.cp_immi_value\u000aisacov.rv32i_lw_cg.cp_rs1_toggle\u000aisacov.rv32i_lw_cg.cp_immi_toggle\u000aisacov.rv32i_lw_cg.cp_aligned -p180 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp181 -sg15 -(lp182 -sg53 -(lp183 -sg13 -(dp184 -g56 -I0 -ssbtp185 -a(V002 -p186 -g1 -(g29 -g3 -Ntp187 -Rp188 -(dp189 -g8 -V002 -p190 -sg23 -VVP_ISA_F003_S002_I002 -p191 -sg35 -Vlw rd, rs1, imm\u000ard = Sext(M[rs1+imm][0:31])\u000ard is calculated using signed arithmetic -p192 -sg37 -VISA\u000aChapter 2.6 -p193 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p194 -sg41 -Visacov.rv32i_lw_cg.cp_rd_value\u000aisacov.rv32i_lw_cg.cp_rd_toggle -p195 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp196 -sg15 -(lp197 -sg53 -(lp198 -sg13 -(dp199 -g56 -I0 -ssbtp200 -asg88 -(lp201 -sg53 -(lp202 -sg13 -(dp203 -sbtp204 -a(V003_LBU -p205 -g1 -(g18 -g3 -Ntp206 -Rp207 -(dp208 -g22 -I3 -sg8 -g205 -sg23 -VVP_IP003_P003 -p209 -sg25 -(dp210 -sg12 -I3 -sg15 -(lp211 -(V000 -p212 -g1 -(g29 -g3 -Ntp213 -Rp214 -(dp215 -g8 -V000 -p216 -sg23 -VVP_ISA_F003_S003_I000 -p217 -sg35 -Vlbu rd, rs1, imm\u000ard = Zext(M[rs1+imm][0:7])\u000ard is calculated using unsigned arithmetic -p218 -sg37 -VISA\u000aChapter 2.6 -p219 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p220 -sg41 -Visacov.rv32i_lbu_cg.cp_rs1\u000aisacov.rv32i_lbu_cg.cp_rd\u000aisacov.rv32i_lbu_cg.cp_rd_rs1_hazard -p221 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp222 -sg15 -(lp223 -sg53 -(lp224 -sg13 -(dp225 -g56 -I0 -ssbtp226 -a(V001 -p227 -g1 -(g29 -g3 -Ntp228 -Rp229 -(dp230 -g8 -V001 -p231 -sg23 -VVP_ISA_F003_S003_I001 -p232 -sg35 -Vlbu rd, rs1, imm\u000ard = Zext(M[rs1+imm][0:7])\u000ard is calculated using unsigned arithmetic -p233 -sg37 -VISA\u000aChapter 2.6 -p234 -sg39 -VInput operands:\u000a\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled -p235 -sg41 -Visacov.rv32i_lbu_cg.cp_immi_value\u000aisacov.rv32i_lbu_cg.cp_rs1_toggle\u000aisacov.rv32i_lbu_cg.cp_immi_toggle -p236 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp237 -sg15 -(lp238 -sg53 -(lp239 -sg13 -(dp240 -g56 -I0 -ssbtp241 -a(V002 -p242 -g1 -(g29 -g3 -Ntp243 -Rp244 -(dp245 -g8 -V002 -p246 -sg23 -VVP_ISA_F003_S003_I002 -p247 -sg35 -Vlbu rd, rs1, imm\u000ard = Zext(M[rs1+imm][0:7])\u000ard is calculated using unsigned arithmetic -p248 -sg37 -VISA\u000aChapter 2.6 -p249 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd[7:0] are toggled -p250 -sg41 -Visacov.rv32i_lbu_cg.cp_rd_value\u000aisacov.rv32i_lbu_cg.cp_rd_toggle -p251 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp252 -sg15 -(lp253 -sg53 -(lp254 -sg13 -(dp255 -g56 -I0 -ssbtp256 -asg88 -(lp257 -sg53 -(lp258 -sg13 -(dp259 -sbtp260 -a(V004_LHU -p261 -g1 -(g18 -g3 -Ntp262 -Rp263 -(dp264 -g22 -I3 -sg8 -g261 -sg23 -VVP_IP003_P004 -p265 -sg25 -(dp266 -sg12 -I4 -sg15 -(lp267 -(V000 -p268 -g1 -(g29 -g3 -Ntp269 -Rp270 -(dp271 -g8 -V000 -p272 -sg23 -VVP_ISA_F003_S004_I000 -p273 -sg35 -Vlhu rd, rs1, imm\u000ard = Zext(M[rs1+imm][0:15])\u000ard is calculated using unsigned arithmetic -p274 -sg37 -VISA\u000aChapter 2.6 -p275 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p276 -sg41 -Visacov.rv32i_lhu_cg.cp_rs1\u000aisacov.rv32i_lhu_cg.cp_rd\u000aisacov.rv32i_lhu_cg.cp_rd_rs1_hazard -p277 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp278 -sg15 -(lp279 -sg53 -(lp280 -sg13 -(dp281 -g56 -I0 -ssbtp282 -a(V001 -p283 -g1 -(g29 -g3 -Ntp284 -Rp285 -(dp286 -g8 -V001 -p287 -sg23 -VVP_ISA_F003_S004_I001 -p288 -sg35 -Vlhu rd, rs1, imm\u000ard = Zext(M[rs1+imm][0:15])\u000ard is calculated using unsigned arithmetic -p289 -sg37 -VISA\u000aChapter 2.6 -p290 -sg39 -VInput operands:\u000a\u000aimmi value is +ve, -ve and zero\u000aAll combinations of rs1 and immi +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of immi are toggled\u000aUnaligned and aligned accesses from memory -p291 -sg41 -Visacov.rv32i_lhu_cg.cp_immi_value\u000aisacov.rv32i_lhu_cg.cp_rs1_toggle\u000aisacov.rv32i_lhu_cg.cp_immi_toggle\u000aisacov.rv32i_lhu_cg.cp_aligned -p292 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp293 -sg15 -(lp294 -sg53 -(lp295 -sg13 -(dp296 -g56 -I0 -ssbtp297 -a(V002 -p298 -g1 -(g29 -g3 -Ntp299 -Rp300 -(dp301 -g8 -V002 -p302 -sg23 -VVP_ISA_F003_S004_I002 -p303 -sg35 -Vlhu rd, rs1, imm\u000ard = Zext(M[rs1+imm][0:15])\u000ard is calculated using unsigned arithmetic -p304 -sg37 -VISA\u000aChapter 2.6 -p305 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd[15:0] are toggled -p306 -sg41 -Visacov.rv32i_lhu_cg.cp_rd_value\u000aisacov.rv32i_lhu_cg.cp_rd_toggle -p307 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp308 -sg15 -(lp309 -sg53 -(lp310 -sg13 -(dp311 -g56 -I0 -ssbtp312 -asg88 -(lp313 -sg53 -(lp314 -sg13 -(dp315 -sbtp316 -a(V005_SB -p317 -g1 -(g18 -g3 -Ntp318 -Rp319 -(dp320 -g22 -I3 -sg8 -g317 -sg23 -VVP_IP003_P005 -p321 -sg25 -(dp322 -sg12 -I5 -sg15 -(lp323 -(V000 -p324 -g1 -(g29 -g3 -Ntp325 -Rp326 -(dp327 -g8 -V000 -p328 -sg23 -VVP_ISA_F003_S005_I000 -p329 -sg35 -Vsb rs1, rs2, imm\u000aM[rs1+imm][0:7] = rs2[0:7] -p330 -sg37 -VISA\u000aChapter 2.6 -p331 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p332 -sg41 -Visacov.rv32i_sb_cg.cp_rs1\u000aisacov.rv32i_sb_cg.cp_rs2 -p333 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp334 -sg15 -(lp335 -sg53 -(lp336 -sg13 -(dp337 -g56 -I0 -ssbtp338 -a(V001 -p339 -g1 -(g29 -g3 -Ntp340 -Rp341 -(dp342 -g8 -V001 -p343 -sg23 -VVP_ISA_F003_S005_I001 -p344 -sg35 -Vsb rs1, rs2, imm\u000aM[rs1+imm][0:7] = rs2[0:7] -p345 -sg37 -VISA\u000aChapter 2.6 -p346 -sg39 -VInput operands:\u000a\u000aimms value is +ve, -ve and zero\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aAll bits of imms are toggled -p347 -sg41 -Visacov.rv32i_sb_cg.cp_imms_value\u000aisacov.rv32i_sb_cg.cp_rs1_toggle\u000aisacov.rv32i_sb_cg.cp_rs2_toggle\u000aisacov.rv32i_sb_cg.cp_imms_toggle -p348 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp349 -sg15 -(lp350 -sg53 -(lp351 -sg13 -(dp352 -g56 -I0 -ssbtp353 -asg88 -(lp354 -sg53 -(lp355 -sg13 -(dp356 -sbtp357 -a(V006_SH -p358 -g1 -(g18 -g3 -Ntp359 -Rp360 -(dp361 -g22 -I2 -sg8 -g358 -sg23 -VVP_IP003_P006 -p362 -sg25 -(dp363 -sg12 -I6 -sg15 -(lp364 -(V000 -p365 -g1 -(g29 -g3 -Ntp366 -Rp367 -(dp368 -g8 -V000 -p369 -sg23 -VVP_ISA_F003_S006_I000 -p370 -sg35 -Vsh rs1, rs2, imm\u000aM[rs1+imm][0:15] = rs2[0:15] -p371 -sg37 -VISA\u000aChapter 2.6 -p372 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p373 -sg41 -Visacov.rv32i_sh_cg.cp_rs1\u000aisacov.rv32i_sh_cg.cp_rs2 -p374 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp375 -sg15 -(lp376 -sg53 -(lp377 -sg13 -(dp378 -g56 -I0 -ssbtp379 -a(V001 -p380 -g1 -(g29 -g3 -Ntp381 -Rp382 -(dp383 -g8 -V001 -p384 -sg23 -VVP_ISA_F003_S006_I001 -p385 -sg35 -Vsh rs1, rs2, imm\u000aM[rs1+imm][0:15] = rs2[0:15] -p386 -sg37 -VISA\u000aChapter 2.6 -p387 -sg39 -VInput operands:\u000a\u000aimms value is +ve, -ve and zero\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aAll bits of imms are toggled\u000aUnaligned and aligned accesses to memory -p388 -sg41 -Visacov.rv32i_sh_cg.cp_imms_value\u000aisacov.rv32i_sh_cg.cp_rs1_toggle\u000aisacov.rv32i_sh_cg.cp_rs2_toggle\u000aisacov.rv32i_sh_cg.cp_imms_toggle\u000aisacov.rv32i_sh_cg.cp_aligned -p389 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp390 -sg15 -(lp391 -sg53 -(lp392 -sg13 -(dp393 -g56 -I0 -ssbtp394 -asg88 -(lp395 -sg53 -(lp396 -sg13 -(dp397 -sbtp398 -a(V007_SW -p399 -g1 -(g18 -g3 -Ntp400 -Rp401 -(dp402 -g22 -I2 -sg8 -g399 -sg23 -VVP_IP003_P007 -p403 -sg25 -(dp404 -sg12 -I7 -sg15 -(lp405 -(V000 -p406 -g1 -(g29 -g3 -Ntp407 -Rp408 -(dp409 -g8 -V000 -p410 -sg23 -VVP_ISA_F003_S007_I000 -p411 -sg35 -Vsw rs1, rs2, imm\u000aM[rs1+imm][0:31] = rs2[0:31] -p412 -sg37 -VISA\u000aChapter 2.6 -p413 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used. -p414 -sg41 -Visacov.rv32i_sw_cg.cp_rs1\u000aisacov.rv32i_sw_cg.cp_rs2 -p415 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp416 -sg15 -(lp417 -sg53 -(lp418 -sg13 -(dp419 -g56 -I0 -ssbtp420 -a(V001 -p421 -g1 -(g29 -g3 -Ntp422 -Rp423 -(dp424 -g8 -V001 -p425 -sg23 -VVP_ISA_F003_S007_I001 -p426 -sg35 -Vsw rs1, rs2, imm\u000aM[rs1+imm][0:31] = rs2[0:31] -p427 -sg37 -VISA\u000aChapter 2.6 -p428 -sg39 -VInput operands:\u000a\u000aimms value is +ve, -ve and zero\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aAll bits of imms are toggled\u000aUnaligned and aligned accesses to memory -p429 -sg41 -Visacov.rv32i_sw_cg.cp_imms_value\u000aisacov.rv32i_sw_cg.cp_rs1_toggle\u000aisacov.rv32i_sw_cg.cp_rs2_toggle\u000aisacov.rv32i_sw_cg.cp_imms_toggle\u000aisacov.rv32i_sw_cg.cp_aligned -p430 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp431 -sg15 -(lp432 -sg53 -(lp433 -sg13 -(dp434 -g56 -I0 -ssbtp435 -asg88 -(lp436 -sg53 -(lp437 -sg13 -(dp438 -sbtp439 -asVrfu_list_0 -p440 -(lp441 -sg88 -(lp442 -sVvptool_gitrev -p443 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p444 -sVio_fmt_gitrev -p445 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p446 -sVconfig_gitrev -p447 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p448 -sVymlcfg_gitrev -p449 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p450 -sbtp451 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml new file mode 100644 index 000000000..cf67b09c1 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml @@ -0,0 +1,454 @@ +!Feature +next_elt_id: 8 +name: RV32I Load and Store Instructions +id: 3 +display_order: 3 +subfeatures: !!omap +- 000_LB: !Subfeature + name: 000_LB + tag: VP_IP003_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S000_I000 + description: "lb rd, rs1, imm\nrd = Sext(M[rs1+imm][0:7])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lb_cg.cp_rs1\nisacov.rv32i_lb_cg.cp_rd\nisacov.rv32i_lb_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S000_I001 + description: "lb rd, rs1, imm\nrd = Sext(M[rs1+imm][0:7])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmi value is +ve, -ve and zero\nAll combinations\ + \ of rs1 and immi +ve, -ve, and zero values are used\nAll bits of rs1 are\ + \ toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lb_cg.cp_immi_value\nisacov.rv32i_lb_cg.cp_rs1_toggle\n\ + isacov.rv32i_lb_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F003_S000_I002 + description: "lb rd, rs1, imm\nrd = Sext(M[rs1+imm][0:7])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lb_cg.cp_rd_value\nisacov.rv32i_lb_cg.cp_rd_toggle" + comments: '' +- 001_LH: !Subfeature + name: 001_LH + tag: VP_IP003_P001 + next_elt_id: 3 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S001_I000 + description: "lh rd, rs1, imm\nrd = Sext(M[rs1+imm][0:15])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lh_cg.cp_rs1\nisacov.rv32i_lh_cg.cp_rd\nisacov.rv32i_lh_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S001_I001 + description: "lh rd, rs1, imm\nrd = Sext(M[rs1+imm][0:15])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmi value is +ve, -ve and zero\nAll combinations\ + \ of rs1 and immi +ve, -ve, and zero values are used\nAll bits of rs1 are\ + \ toggled\nAll bits of immi are toggled\nUnaligned and aligned accesses\ + \ from memory" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lh_cg.cp_immi_value\nisacov.rv32i_lh_cg.cp_rs1_toggle\n\ + isacov.rv32i_lh_cg.cp_immi_toggle\nisacov.rv32i_lh_cg.cp_aligned" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F003_S001_I002 + description: "lh rd, rs1, imm\nrd = Sext(M[rs1+imm][0:15])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lh_cg.cp_rd_value\nisacov.rv32i_lh_cg.cp_rd_toggle" + comments: '' +- 002_LW: !Subfeature + name: 002_LW + tag: VP_IP003_P002 + next_elt_id: 3 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S002_I000 + description: "lw rd, rs1, imm\nrd = Sext(M[rs1+imm][0:31])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lw_cg.cp_rs1\nisacov.rv32i_lw_cg.cp_rd\nisacov.rv32i_lw_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S002_I001 + description: "lw rd, rs1, imm\nrd = Sext(M[rs1+imm][0:31])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmi value is +ve, -ve and zero\nAll combinations\ + \ of rs1 and immi +ve, -ve, and zero values are used\nAll bits of rs1 are\ + \ toggled\nAll bits of immi are toggled\nUnaligned and aligned accesses\ + \ from memory" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lw_cg.cp_immi_value\nisacov.rv32i_lw_cg.cp_rs1_toggle\n\ + isacov.rv32i_lw_cg.cp_immi_toggle\nisacov.rv32i_lw_cg.cp_aligned" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F003_S002_I002 + description: "lw rd, rs1, imm\nrd = Sext(M[rs1+imm][0:31])\nrd is calculated\ + \ using signed arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lw_cg.cp_rd_value\nisacov.rv32i_lw_cg.cp_rd_toggle" + comments: '' +- 003_LBU: !Subfeature + name: 003_LBU + tag: VP_IP003_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S003_I000 + description: "lbu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:7])\nrd is calculated\ + \ using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lbu_cg.cp_rs1\nisacov.rv32i_lbu_cg.cp_rd\nisacov.rv32i_lbu_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S003_I001 + description: "lbu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:7])\nrd is calculated\ + \ using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmi value is +ve, -ve and zero\nAll combinations\ + \ of rs1 and immi +ve, -ve, and zero values are used\nAll bits of rs1 are\ + \ toggled\nAll bits of immi are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lbu_cg.cp_immi_value\nisacov.rv32i_lbu_cg.cp_rs1_toggle\n\ + isacov.rv32i_lbu_cg.cp_immi_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F003_S003_I002 + description: "lbu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:7])\nrd is calculated\ + \ using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd[7:0] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lbu_cg.cp_rd_value\nisacov.rv32i_lbu_cg.cp_rd_toggle" + comments: '' +- 004_LHU: !Subfeature + name: 004_LHU + tag: VP_IP003_P004 + next_elt_id: 3 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S004_I000 + description: "lhu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:15])\nrd is calculated\ + \ using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lhu_cg.cp_rs1\nisacov.rv32i_lhu_cg.cp_rd\nisacov.rv32i_lhu_cg.cp_rd_rs1_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S004_I001 + description: "lhu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:15])\nrd is calculated\ + \ using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimmi value is +ve, -ve and zero\nAll combinations\ + \ of rs1 and immi +ve, -ve, and zero values are used\nAll bits of rs1 are\ + \ toggled\nAll bits of immi are toggled\nUnaligned and aligned accesses\ + \ from memory" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lhu_cg.cp_immi_value\nisacov.rv32i_lhu_cg.cp_rs1_toggle\n\ + isacov.rv32i_lhu_cg.cp_immi_toggle\nisacov.rv32i_lhu_cg.cp_aligned" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F003_S004_I002 + description: "lhu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:15])\nrd is calculated\ + \ using unsigned arithmetic" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd[15:0] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_lhu_cg.cp_rd_value\nisacov.rv32i_lhu_cg.cp_rd_toggle" + comments: '' +- 005_SB: !Subfeature + name: 005_SB + tag: VP_IP003_P005 + next_elt_id: 3 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S005_I000 + description: "sb rs1, rs2, imm\nM[rs1+imm][0:7] = rs2[0:7]" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sb_cg.cp_rs1\nisacov.rv32i_sb_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S005_I001 + description: "sb rs1, rs2, imm\nM[rs1+imm][0:7] = rs2[0:7]" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimms value is +ve, -ve and zero\nAll bits\ + \ of rs1 are toggled\nAll bits of rs2 are toggled\nAll bits of imms are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sb_cg.cp_imms_value\nisacov.rv32i_sb_cg.cp_rs1_toggle\n\ + isacov.rv32i_sb_cg.cp_rs2_toggle\nisacov.rv32i_sb_cg.cp_imms_toggle" + comments: '' +- 006_SH: !Subfeature + name: 006_SH + tag: VP_IP003_P006 + next_elt_id: 2 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S006_I000 + description: "sh rs1, rs2, imm\nM[rs1+imm][0:15] = rs2[0:15]" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sh_cg.cp_rs1\nisacov.rv32i_sh_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S006_I001 + description: "sh rs1, rs2, imm\nM[rs1+imm][0:15] = rs2[0:15]" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimms value is +ve, -ve and zero\nAll bits\ + \ of rs1 are toggled\nAll bits of rs2 are toggled\nAll bits of imms are\ + \ toggled\nUnaligned and aligned accesses to memory" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sh_cg.cp_imms_value\nisacov.rv32i_sh_cg.cp_rs1_toggle\n\ + isacov.rv32i_sh_cg.cp_rs2_toggle\nisacov.rv32i_sh_cg.cp_imms_toggle\nisacov.rv32i_sh_cg.cp_aligned" + comments: '' +- 007_SW: !Subfeature + name: 007_SW + tag: VP_IP003_P007 + next_elt_id: 2 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F003_S007_I000 + description: "sw rs1, rs2, imm\nM[rs1+imm][0:31] = rs2[0:31]" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sw_cg.cp_rs1\nisacov.rv32i_sw_cg.cp_rs2" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F003_S007_I001 + description: "sw rs1, rs2, imm\nM[rs1+imm][0:31] = rs2[0:31]" + reqt_doc: "ISA\nChapter 2.6" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nimms value is +ve, -ve and zero\nAll bits\ + \ of rs1 are toggled\nAll bits of rs2 are toggled\nAll bits of imms are\ + \ toggled\nUnaligned and aligned accesses to memory" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32i_sw_cg.cp_imms_value\nisacov.rv32i_sw_cg.cp_rs1_toggle\n\ + isacov.rv32i_sw_cg.cp_rs2_toggle\nisacov.rv32i_sw_cg.cp_imms_toggle\nisacov.rv32i_sw_cg.cp_aligned" + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.pck deleted file mode 100644 index bd77b2b90..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.pck +++ /dev/null @@ -1,157 +0,0 @@ -(VRV32I Memory Ordering Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I1 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I4 -sVwid_order -p12 -I4 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_FENCE -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP004_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F004_S000_I000 -p34 -sVdescription -p35 -VFence operation executed\u000aImplementation is microarchitecture specific -p36 -sVpurpose -p37 -VISA\u000aChapter 2.7 -p38 -sVverif_goals -p39 -VInstruction executed -p40 -sVcoverage_loc -p41 -Visacov.rv32i_fence.cp_fixed -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -asVrfu_list_1 -p58 -(lp59 -sg53 -(lp60 -sg13 -(dp61 -sbtp62 -asVrfu_list_0 -p63 -(lp64 -sg58 -(lp65 -sVvptool_gitrev -p66 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p67 -sVio_fmt_gitrev -p68 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p69 -sVconfig_gitrev -p70 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p71 -sVymlcfg_gitrev -p72 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p73 -sbtp74 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml new file mode 100644 index 000000000..01a61498b --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml @@ -0,0 +1,33 @@ +!Feature +next_elt_id: 1 +name: RV32I Memory Ordering Instructions +id: 4 +display_order: 4 +subfeatures: !!omap +- 000_FENCE: !Subfeature + name: 000_FENCE + tag: VP_IP004_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F004_S000_I000 + description: "Fence operation executed\nImplementation is microarchitecture\ + \ specific" + reqt_doc: "ISA\nChapter 2.7" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Instruction executed + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_fence.cp_fixed + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.pck deleted file mode 100644 index f17fd3ee4..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.pck +++ /dev/null @@ -1,284 +0,0 @@ -(VRV32I Environment Call and Breakpoints -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I2 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I5 -sVwid_order -p12 -I5 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_ECALL -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I2 -sg8 -g17 -sVtag -p23 -VVP_IP005_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F005_S000_I000 -p34 -sVdescription -p35 -VSoftware exception vector entered -p36 -sVpurpose -p37 -VISA\u000aChapter 2.8 -p38 -sVverif_goals -p39 -VInstruction executed -p40 -sVcoverage_loc -p41 -Visacov.rv32i_ecall.cp_fixed -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -V001 -p62 -sg23 -VVP_ISA_F005_S000_I001 -p63 -sg35 -VReturn control to a debugger -p64 -sg37 -VISA\u000aChapter 2.8 -p65 -sg39 -VInstruction executed -p66 -sg41 -Visacov.rv32i_ebreak.cp_fixed -p67 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp68 -sg15 -(lp69 -sg53 -(lp70 -sg13 -(dp71 -g56 -I0 -ssbtp72 -asVrfu_list_1 -p73 -(lp74 -sg53 -(lp75 -sg13 -(dp76 -sbtp77 -a(V001_EBREAK -p78 -g1 -(g18 -g3 -Ntp79 -Rp80 -(dp81 -g22 -I1 -sg8 -g78 -sg23 -VVP_IP005_P001 -p82 -sg25 -(dp83 -sg12 -I1 -sg15 -(lp84 -(V000 -p85 -g1 -(g29 -g3 -Ntp86 -Rp87 -(dp88 -g8 -V000 -p89 -sg23 -VVP_ISA_F005_S001_I000 -p90 -sg35 -VReturn control to a debugger -p91 -sg37 -VISA\u000aChapter 2.8 -p92 -sg39 -VInstruction executed -p93 -sg41 -Visacov.rv32i_ebreak.cp_fixed -p94 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp95 -sg15 -(lp96 -sg53 -(lp97 -sg13 -(dp98 -Vlock_status -p99 -I0 -ssbtp100 -asg73 -(lp101 -sg53 -(lp102 -sg13 -(dp103 -sbtp104 -asVrfu_list_0 -p105 -(lp106 -sg73 -(lp107 -sVvptool_gitrev -p108 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p109 -sVio_fmt_gitrev -p110 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p111 -sVconfig_gitrev -p112 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p113 -sVymlcfg_gitrev -p114 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p115 -sbtp116 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml new file mode 100644 index 000000000..85fd2a35c --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml @@ -0,0 +1,70 @@ +!Feature +next_elt_id: 2 +name: RV32I Environment Call and Breakpoints +id: 5 +display_order: 5 +subfeatures: !!omap +- 000_ECALL: !Subfeature + name: 000_ECALL + tag: VP_IP005_P000 + next_elt_id: 2 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F005_S000_I000 + description: Software exception vector entered + reqt_doc: "ISA\nChapter 2.8" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Instruction executed + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_ecall.cp_fixed + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F005_S000_I001 + description: Return control to a debugger + reqt_doc: "ISA\nChapter 2.8" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Instruction executed + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_ebreak.cp_fixed + comments: '' +- 001_EBREAK: !Subfeature + name: 001_EBREAK + tag: VP_IP005_P001 + next_elt_id: 1 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F005_S001_I000 + description: Return control to a debugger + reqt_doc: "ISA\nChapter 2.8" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Instruction executed + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32i_ebreak.cp_fixed + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.pck deleted file mode 100644 index 540f7f495..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.pck +++ /dev/null @@ -1,780 +0,0 @@ -(VRV32M Multiplication Operations -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I7 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I6 -sVwid_order -p12 -I6 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_MUL -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I3 -sg8 -g17 -sVtag -p23 -VVP_IP000_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F000_S000_I000 -p34 -sVdescription -p35 -Vmul rd, rs1, rs2\u000ax[rd] = x[rs1] * x[rs2]\u000aArithmetic overflow is ignored. -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 7.1 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p40 -sVcoverage_loc -p41 -Visacov.rv32m_mul_cg.cp_rs1\u000aisacov.rv32m_mul_cg.cp_rs2\u000aisacov.rv32m_mul_cg.cp_rd\u000aisacov.rv32m_mul_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_mul_cg.cp_rd_rs2_hazard -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -V001 -p62 -sg23 -VVP_ISA_F000_S000_I001 -p63 -sg35 -Vmul rd, rs1, rs2\u000ax[rd] = x[rs1] * x[rs2]\u000aArithmetic overflow is ignored. -p64 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p65 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is non-zero and zero\u000aAll combinations of rs1 and rs2 non-zero and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p66 -sg41 -Visacov.rv32m_mul_cg.cp_rs1_value\u000aisacov.rv32m_mul_cg.cp_rs2_value\u000aisacov.rv32m_mul_cg.cross_rs1_rs2_value\u000aisacov.rv32m_mul_cg.cp_rs1_toggle \u000aisacov.rv32m_mul_cg.cp_rs2_toggle -p67 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp68 -sg15 -(lp69 -sg53 -(lp70 -sg13 -(dp71 -g56 -I0 -ssbtp72 -a(V002 -p73 -g1 -(g29 -g3 -Ntp74 -Rp75 -(dp76 -g8 -V002 -p77 -sg23 -VVP_ISA_F000_S000_I002 -p78 -sg35 -Vmul rd, rs1, rs2\u000ax[rd] = x[rs1] * x[rs2]\u000aArithmetic overflow is ignored. -p79 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p80 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero\u000aAll bits of rd are toggled -p81 -sg41 -Visacov.rv32m_mul_cg.cp_rd_value\u000aisacov.rv32m_mul_cg.cp_rd_toggle -p82 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp83 -sg15 -(lp84 -sg53 -(lp85 -sg13 -(dp86 -g56 -I0 -ssbtp87 -asVrfu_list_1 -p88 -(lp89 -sg53 -(lp90 -sg13 -(dp91 -sbtp92 -a(V001_MULH -p93 -g1 -(g18 -g3 -Ntp94 -Rp95 -(dp96 -g22 -I3 -sg8 -g93 -sg23 -VVP_IP000_P001 -p97 -sg25 -(dp98 -sg12 -I1 -sg15 -(lp99 -(V000 -p100 -g1 -(g29 -g3 -Ntp101 -Rp102 -(dp103 -g8 -V000 -p104 -sg23 -VVP_ISA_F000_S001_I000 -p105 -sg35 -Vmulh rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >>s XLEN\u000aBoth rs1 and rs2 treated as signed numbers -p106 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p107 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p108 -sg41 -Visacov.rv32m_mulh_cg.cp_rs1\u000aisacov.rv32m_mulh_cg.cp_rs2\u000aisacov.rv32m_mulh_cg.cp_rd\u000aisacov.rv32m_mulh_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_mulh_cg.cp_rd_rs2_hazard -p109 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I32 -sg47 -g48 -sg49 -g48 -sg50 -(lp110 -sg15 -(lp111 -sg53 -(lp112 -sg13 -(dp113 -g56 -I0 -ssbtp114 -a(V001 -p115 -g1 -(g29 -g3 -Ntp116 -Rp117 -(dp118 -g8 -V001 -p119 -sg23 -VVP_ISA_F000_S001_I001 -p120 -sg35 -Vmulh rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >>s XLEN\u000aBoth rs1 and rs2 treated as signed numbers -p121 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p122 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p123 -sg41 -Visacov.rv32m_mulh_cg.cp_rs1_value\u000aisacov.rv32m_mulh_cg.cp_rs2_value\u000aisacov.rv32m_mulh_cg.cross_rs1_rs2_value\u000aisacov.rv32m_mulh_cg.cp_rs1_toggle \u000aisacov.rv32m_mulh_cg.cp_rs2_toggle -p124 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I32 -sg47 -g48 -sg49 -g48 -sg50 -(lp125 -sg15 -(lp126 -sg53 -(lp127 -sg13 -(dp128 -g56 -I0 -ssbtp129 -a(V002 -p130 -g1 -(g29 -g3 -Ntp131 -Rp132 -(dp133 -g8 -V002 -p134 -sg23 -VVP_ISA_F000_S001_I002 -p135 -sg35 -Vmulh rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >>s XLEN\u000aBoth rs1 and rs2 treated as signed numbers -p136 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p137 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p138 -sg41 -Visacov.rv32m_mulh_cg.cp_rd_value\u000aisacov.rv32m_mulh_cg.cp_rd_toggle -p139 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp140 -sg15 -(lp141 -sg53 -(lp142 -sg13 -(dp143 -g56 -I0 -ssbtp144 -asg88 -(lp145 -sg53 -(lp146 -sg13 -(dp147 -sbtp148 -a(V002_MULHU -p149 -g1 -(g18 -g3 -Ntp150 -Rp151 -(dp152 -g22 -I3 -sg8 -g149 -sg23 -VVP_IP000_P002 -p153 -sg25 -(dp154 -sg12 -I2 -sg15 -(lp155 -(V000 -p156 -g1 -(g29 -g3 -Ntp157 -Rp158 -(dp159 -g8 -V000 -p160 -sg23 -VVP_ISA_F000_S002_I000 -p161 -sg35 -Vmulhu rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >> XLEN\u000aBoth rs1 and rs2 treated as unsigned numbers -p162 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p163 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p164 -sg41 -Visacov.rv32m_mulhu_cg.cp_rs1\u000aisacov.rv32m_mulhu_cg.cp_rs2\u000aisacov.rv32m_mulhu_cg.cp_rd\u000aisacov.rv32m_mulhu_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_mulhu_cg.cp_rd_rs2_hazard -p165 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp166 -sg15 -(lp167 -sg53 -(lp168 -sg13 -(dp169 -g56 -I0 -ssbtp170 -a(V001 -p171 -g1 -(g29 -g3 -Ntp172 -Rp173 -(dp174 -g8 -V001 -p175 -sg23 -VVP_ISA_F000_S002_I001 -p176 -sg35 -Vmulhu rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >> XLEN\u000aBoth rs1 and rs2 treated as unsigned numbers -p177 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p178 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is non-zero and zero\u000aAll combinations of rs1 and rs2 non-zero and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p179 -sg41 -Visacov.rv32m_mulhu_cg.cp_rs1_value\u000aisacov.rv32m_mulhu_cg.cp_rs2_value\u000aisacov.rv32m_mulhu_cg.cross_rs1_rs2_value\u000aisacov.rv32m_mulhu_cg.cp_rs1_toggle \u000aisacov.rv32m_mulhu_cg.cp_rs2_toggle -p180 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp181 -sg15 -(lp182 -sg53 -(lp183 -sg13 -(dp184 -g56 -I0 -ssbtp185 -a(V002 -p186 -g1 -(g29 -g3 -Ntp187 -Rp188 -(dp189 -g8 -V002 -p190 -sg23 -VVP_ISA_F000_S002_I002 -p191 -sg35 -Vmulhu rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >> XLEN\u000aBoth rs1 and rs2 treated as unsigned numbers -p192 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p193 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero\u000aAll bits of rd are toggled -p194 -sg41 -Visacov.rv32m_mulhu_cg.cp_rd_value\u000aisacov.rv32m_mulhu_cg.cp_rd_toggle -p195 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp196 -sg15 -(lp197 -sg53 -(lp198 -sg13 -(dp199 -g56 -I0 -ssbtp200 -asg88 -(lp201 -sg53 -(lp202 -sg13 -(dp203 -sbtp204 -a(V003_MULHSU -p205 -g1 -(g18 -g3 -Ntp206 -Rp207 -(dp208 -g22 -I3 -sg8 -g205 -sg23 -VVP_IP000_P003 -p209 -sg25 -(dp210 -sg12 -I3 -sg15 -(lp211 -(V000 -p212 -g1 -(g29 -g3 -Ntp213 -Rp214 -(dp215 -g8 -V000 -p216 -sg23 -VVP_ISA_F000_S003_I000 -p217 -sg35 -Vmulhsu rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >>s XLEN\u000ars1 treated as signed number, rs2 treated as unsigned number -p218 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p219 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p220 -sg41 -Visacov.rv32m_mulhsu_cg.cp_rs1\u000aisacov.rv32m_mulhsu_cg.cp_rs2\u000aisacov.rv32m_mulhsu_cg.cp_rd\u000aisacov.rv32m_mulhsu_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_mulhsu_cg.cp_rd_rs2_hazard -p221 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp222 -sg15 -(lp223 -sg53 -(lp224 -sg13 -(dp225 -g56 -I0 -ssbtp226 -a(V001 -p227 -g1 -(g29 -g3 -Ntp228 -Rp229 -(dp230 -g8 -V001 -p231 -sg23 -VVP_ISA_F000_S003_I001 -p232 -sg35 -Vmulhsu rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >>s XLEN\u000ars1 treated as signed number, rs2 treated as unsigned number -p233 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p234 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is non-zero and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p235 -sg41 -Visacov.rv32m_mulhsu_cg.cp_rs1_value\u000aisacov.rv32m_mulhsu_cg.cp_rs2_value\u000aisacov.rv32m_mulhsu_cg.cross_rs1_rs2_value\u000aisacov.rv32m_mulhsu_cg.cp_rs1_toggle \u000aisacov.rv32m_mulhsu_cg.cp_rs2_toggle -p236 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp237 -sg15 -(lp238 -sg53 -(lp239 -sg13 -(dp240 -g56 -I0 -ssbtp241 -a(V002 -p242 -g1 -(g29 -g3 -Ntp243 -Rp244 -(dp245 -g8 -V002 -p246 -sg23 -VVP_ISA_F000_S003_I002 -p247 -sg35 -Vmulhsu rd, rs1, rs2\u000ax[rd] = (x[rs1] * x[rs2]) >>s XLEN\u000ars1 treated as signed number, rs2 treated as unsigned number -p248 -sg37 -VUnprivileged ISA\u000aChapter 7.1 -p249 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p250 -sg41 -Visacov.rv32m_mulhsu_cg.cp_rd_value\u000aisacov.rv32m_mulhsu_cg.cp_rd_toggle -p251 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp252 -sg15 -(lp253 -sg53 -(lp254 -sg13 -(dp255 -g56 -I0 -ssbtp256 -asg88 -(lp257 -sg53 -(lp258 -sg13 -(dp259 -sbtp260 -asVrfu_list_0 -p261 -(lp262 -sg88 -(lp263 -sVvptool_gitrev -p264 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p265 -sVio_fmt_gitrev -p266 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p267 -sVconfig_gitrev -p268 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p269 -sVymlcfg_gitrev -p270 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p271 -sbtp272 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml new file mode 100644 index 000000000..fa7e67190 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml @@ -0,0 +1,275 @@ +!Feature +next_elt_id: 7 +name: RV32M Multiplication Operations +id: 6 +display_order: 6 +subfeatures: !!omap +- 000_MUL: !Subfeature + name: 000_MUL + tag: VP_IP000_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F000_S000_I000 + description: "mul rd, rs1, rs2\nx[rd] = x[rs1] * x[rs2]\nArithmetic overflow\ + \ is ignored." + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mul_cg.cp_rs1\nisacov.rv32m_mul_cg.cp_rs2\nisacov.rv32m_mul_cg.cp_rd\n\ + isacov.rv32m_mul_cg.cp_rd_rs1_hazard\nisacov.rv32m_mul_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F000_S000_I001 + description: "mul rd, rs1, rs2\nx[rd] = x[rs1] * x[rs2]\nArithmetic overflow\ + \ is ignored." + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is non-zero and zero\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mul_cg.cp_rs1_value\nisacov.rv32m_mul_cg.cp_rs2_value\n\ + isacov.rv32m_mul_cg.cross_rs1_rs2_value\nisacov.rv32m_mul_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_mul_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F000_S000_I002 + description: "mul rd, rs1, rs2\nx[rd] = x[rs1] * x[rs2]\nArithmetic overflow\ + \ is ignored." + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mul_cg.cp_rd_value\nisacov.rv32m_mul_cg.cp_rd_toggle" + comments: '' +- 001_MULH: !Subfeature + name: 001_MULH + tag: VP_IP000_P001 + next_elt_id: 3 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F000_S001_I000 + description: "mulh rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nBoth\ + \ rs1 and rs2 treated as signed numbers" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 32 + coverage_loc: "isacov.rv32m_mulh_cg.cp_rs1\nisacov.rv32m_mulh_cg.cp_rs2\n\ + isacov.rv32m_mulh_cg.cp_rd\nisacov.rv32m_mulh_cg.cp_rd_rs1_hazard\nisacov.rv32m_mulh_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F000_S001_I001 + description: "mulh rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nBoth\ + \ rs1 and rs2 treated as signed numbers" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 32 + coverage_loc: "isacov.rv32m_mulh_cg.cp_rs1_value\nisacov.rv32m_mulh_cg.cp_rs2_value\n\ + isacov.rv32m_mulh_cg.cross_rs1_rs2_value\nisacov.rv32m_mulh_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_mulh_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F000_S001_I002 + description: "mulh rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nBoth\ + \ rs1 and rs2 treated as signed numbers" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulh_cg.cp_rd_value\nisacov.rv32m_mulh_cg.cp_rd_toggle" + comments: '' +- 002_MULHU: !Subfeature + name: 002_MULHU + tag: VP_IP000_P002 + next_elt_id: 3 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F000_S002_I000 + description: "mulhu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >> XLEN\nBoth\ + \ rs1 and rs2 treated as unsigned numbers" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulhu_cg.cp_rs1\nisacov.rv32m_mulhu_cg.cp_rs2\n\ + isacov.rv32m_mulhu_cg.cp_rd\nisacov.rv32m_mulhu_cg.cp_rd_rs1_hazard\nisacov.rv32m_mulhu_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F000_S002_I001 + description: "mulhu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >> XLEN\nBoth\ + \ rs1 and rs2 treated as unsigned numbers" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is non-zero and zero\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulhu_cg.cp_rs1_value\nisacov.rv32m_mulhu_cg.cp_rs2_value\n\ + isacov.rv32m_mulhu_cg.cross_rs1_rs2_value\nisacov.rv32m_mulhu_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_mulhu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F000_S002_I002 + description: "mulhu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >> XLEN\nBoth\ + \ rs1 and rs2 treated as unsigned numbers" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulhu_cg.cp_rd_value\nisacov.rv32m_mulhu_cg.cp_rd_toggle" + comments: '' +- 003_MULHSU: !Subfeature + name: 003_MULHSU + tag: VP_IP000_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F000_S003_I000 + description: "mulhsu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nrs1\ + \ treated as signed number, rs2 treated as unsigned number" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulhsu_cg.cp_rs1\nisacov.rv32m_mulhsu_cg.cp_rs2\n\ + isacov.rv32m_mulhsu_cg.cp_rd\nisacov.rv32m_mulhsu_cg.cp_rd_rs1_hazard\n\ + isacov.rv32m_mulhsu_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F000_S003_I001 + description: "mulhsu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nrs1\ + \ treated as signed number, rs2 treated as unsigned number" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is non-zero and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulhsu_cg.cp_rs1_value\nisacov.rv32m_mulhsu_cg.cp_rs2_value\n\ + isacov.rv32m_mulhsu_cg.cross_rs1_rs2_value\nisacov.rv32m_mulhsu_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_mulhsu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F000_S003_I002 + description: "mulhsu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nrs1\ + \ treated as signed number, rs2 treated as unsigned number" + reqt_doc: "Unprivileged ISA\nChapter 7.1" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_mulhsu_cg.cp_rd_value\nisacov.rv32m_mulhsu_cg.cp_rd_toggle" + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.pck deleted file mode 100644 index 057f15b89..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.pck +++ /dev/null @@ -1,976 +0,0 @@ -(VRV32M Division Operations -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I4 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I7 -sVwid_order -p12 -I7 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_DIV -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I4 -sg8 -g17 -sVtag -p23 -VVP_IP007_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F007_S000_I000 -p34 -sVdescription -p35 -Vdiv rd, rs1, rs2\u000ax[rd] = x[rs1] / x[rs2]\u000ard is calculated using signed arithmetic; rounding towards zero -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 7.2 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p40 -sVcoverage_loc -p41 -Visacov.rv32m_div_cg.cp_rs1\u000aisacov.rv32m_div_cg.cp_rs2\u000aisacov.rv32m_div_cg.cp_rd\u000aisacov.rv32m_div_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_div_cg.cp_rd_rs2_hazard -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -a(V001 -p58 -g1 -(g29 -g3 -Ntp59 -Rp60 -(dp61 -g8 -V001 -p62 -sg23 -VVP_ISA_F007_S000_I001 -p63 -sg35 -Vdiv rd, rs1, rs2\u000ax[rd] = x[rs1] / x[rs2]\u000ard is calculated using signed arithmetic; rounding towards zero -p64 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p65 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p66 -sg41 -Visacov.rv32m_div_cg.cp_rs1_value\u000aisacov.rv32m_div_cg.cp_rs2_value\u000aisacov.rv32m_div_cg.cross_rs1_rs2_value\u000aisacov.rv32m_div_cg.cp_rs1_toggle \u000aisacov.rv32m_div_cg.cp_rs2_toggle -p67 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp68 -sg15 -(lp69 -sg53 -(lp70 -sg13 -(dp71 -g56 -I0 -ssbtp72 -a(V002 -p73 -g1 -(g29 -g3 -Ntp74 -Rp75 -(dp76 -g8 -V002 -p77 -sg23 -VVP_ISA_F007_S000_I002 -p78 -sg35 -Vdiv rd, rs1, rs2\u000ax[rd] = x[rs1] / x[rs2]\u000ard is calculated using signed arithmetic; rounding towards zero -p79 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p80 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p81 -sg41 -Visacov.rv32m_div_cg.cp_rs1_value\u000aisacov.rv32m_div_cg.cp_rs2_value\u000aisacov.rv32m_div_cg.cross_rs1_rs2_value\u000aisacov.rv32m_div_cg.cp_rs1_toggle \u000aisacov.rv32m_div_cg.cp_rs2_toggle -p82 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp83 -sg15 -(lp84 -sg53 -(lp85 -sg13 -(dp86 -g56 -I0 -ssbtp87 -a(V003 -p88 -g1 -(g29 -g3 -Ntp89 -Rp90 -(dp91 -g8 -V003 -p92 -sg23 -VVP_ISA_F007_S000_I003 -p93 -sg35 -Vdiv rd, rs1, rs2\u000ax[rd] = x[rs1] / x[rs2]\u000ard is calculated using signed arithmetic; rounding towards zero -p94 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p95 -sg39 -VExercise arithmetic overflow (rs1 = -2^31; rs2 = -1; returns rd = -2^31).\u000aExercise division by zero (returns -1 ; all bits set) -p96 -sg41 -Visacov.rv32m_div_results_cg.cp_div_special_results\u000aisacov.rv32m_div_results_cg.cp_div_arithmetic_overflow -p97 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp98 -sg15 -(lp99 -sg53 -(lp100 -sg13 -(dp101 -g56 -I0 -ssbtp102 -asVrfu_list_1 -p103 -(lp104 -sg53 -(lp105 -sg13 -(dp106 -sbtp107 -a(V001_REM -p108 -g1 -(g18 -g3 -Ntp109 -Rp110 -(dp111 -g22 -I4 -sg8 -g108 -sg23 -VVP_IP007_P001 -p112 -sg25 -(dp113 -sg12 -I1 -sg15 -(lp114 -(V000 -p115 -g1 -(g29 -g3 -Ntp116 -Rp117 -(dp118 -g8 -V000 -p119 -sg23 -VVP_ISA_F007_S001_I000 -p120 -sg35 -Vrem rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using signed arithmetic; remainder from the same division than DIV (the sign of rd equals the sign of rs1) -p121 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p122 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p123 -sg41 -Visacov.rv32m_rem_cg.cp_rs1\u000aisacov.rv32m_rem_cg.cp_rs2\u000aisacov.rv32m_rem_cg.cp_rd\u000aisacov.rv32m_rem_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_rem_cg.cp_rd_rs2_hazard -p124 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp125 -sg15 -(lp126 -sg53 -(lp127 -sg13 -(dp128 -g56 -I0 -ssbtp129 -a(V001 -p130 -g1 -(g29 -g3 -Ntp131 -Rp132 -(dp133 -g8 -V001 -p134 -sg23 -VVP_ISA_F007_S001_I001 -p135 -sg35 -Vrem rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using signed arithmetic; remainder from the same division than DIV (the sign of rd equals the sign of rs1) -p136 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p137 -sg39 -VInput operands:\u000a\u000ars1 value is +ve, -ve and zero\u000ars2 value is +ve, -ve and zero\u000aAll combinations of rs1 and rs2 +ve, -ve, and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p138 -sg41 -Visacov.rv32m_rem_cg.cp_rs1_value\u000aisacov.rv32m_rem_cg.cp_rs2_value\u000aisacov.rv32m_rem_cg.cross_rs1_rs2_value\u000aisacov.rv32m_rem_cg.cp_rs1_toggle \u000aisacov.rv32m_rem_cg.cp_rs2_toggle -p139 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp140 -sg15 -(lp141 -sg53 -(lp142 -sg13 -(dp143 -g56 -I0 -ssbtp144 -a(V002 -p145 -g1 -(g29 -g3 -Ntp146 -Rp147 -(dp148 -g8 -V002 -p149 -sg23 -VVP_ISA_F007_S001_I002 -p150 -sg35 -Vrem rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using signed arithmetic; remainder from the same division than DIV (the sign of rd equals the sign of rs1) -p151 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p152 -sg39 -VOutput result:\u000a\u000ard value is +ve, -ve and zero\u000aAll bits of rd are toggled -p153 -sg41 -Visacov.rv32m_rem_cg.cp_rd_value\u000aisacov.rv32m_rem_cg.cp_rd_toggle -p154 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp155 -sg15 -(lp156 -sg53 -(lp157 -sg13 -(dp158 -g56 -I0 -ssbtp159 -a(V003 -p160 -g1 -(g29 -g3 -Ntp161 -Rp162 -(dp163 -g8 -V003 -p164 -sg23 -VVP_ISA_F007_S001_I003 -p165 -sg35 -Vrem rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using signed arithmetic; remainder from the same division than DIV (the sign of rd equals the sign of rs1) -p166 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p167 -sg39 -VExercise arithmetic overflow (rs1 = -2^31; rs2 = -1; returns rd = 0).\u000aExercise division by zero (returns rs1) -p168 -sg41 -Visacov.rv32m_rem_results_cg.cp_div_zero\u000aisacov.rv32m_rem_results_cg.cp_div_arithmetic_overflow -p169 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp170 -sg15 -(lp171 -sg53 -(lp172 -sg13 -(dp173 -g56 -I0 -ssbtp174 -asg103 -(lp175 -sg53 -(lp176 -sg13 -(dp177 -sbtp178 -a(V002_DIVU -p179 -g1 -(g18 -g3 -Ntp180 -Rp181 -(dp182 -g22 -I4 -sg8 -g179 -sg23 -VVP_IP007_P002 -p183 -sg25 -(dp184 -sg12 -I2 -sg15 -(lp185 -(V000 -p186 -g1 -(g29 -g3 -Ntp187 -Rp188 -(dp189 -g8 -V000 -p190 -sg23 -VVP_ISA_F007_S002_I000 -p191 -sg35 -Vdivu rd, rs1, rs2\u000ax[rd] = x[rs1] u/ x[rs2]\u000ard is calculated using unsigned arithmetic; rounding towards zero -p192 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p193 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p194 -sg41 -Visacov.rv32m_divu_cg.cp_rs1\u000aisacov.rv32m_divu_cg.cp_rs2\u000aisacov.rv32m_divu_cg.cp_rd\u000aisacov.rv32m_divu_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_divu_cg.cp_rd_rs2_hazard -p195 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp196 -sg15 -(lp197 -sg53 -(lp198 -sg13 -(dp199 -g56 -I0 -ssbtp200 -a(V001 -p201 -g1 -(g29 -g3 -Ntp202 -Rp203 -(dp204 -g8 -V001 -p205 -sg23 -VVP_ISA_F007_S002_I001 -p206 -sg35 -Vdivu rd, rs1, rs2\u000ax[rd] = x[rs1] u/ x[rs2]\u000ard is calculated using unsigned arithmetic; rounding towards zero -p207 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p208 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is non-zero and zero\u000aAll combinations of rs1 and rs2 non-zero and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p209 -sg41 -Visacov.rv32m_divu_cg.cp_rs1_value\u000aisacov.rv32m_divu_cg.cp_rs2_value\u000aisacov.rv32m_divu_cg.cross_rs1_rs2_value\u000aisacov.rv32m_divu_cg.cp_rs1_toggle \u000aisacov.rv32m_divu_cg.cp_rs2_toggle -p210 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp211 -sg15 -(lp212 -sg53 -(lp213 -sg13 -(dp214 -g56 -I0 -ssbtp215 -a(V002 -p216 -g1 -(g29 -g3 -Ntp217 -Rp218 -(dp219 -g8 -V002 -p220 -sg23 -VVP_ISA_F007_S002_I002 -p221 -sg35 -Vdivu rd, rs1, rs2\u000ax[rd] = x[rs1] u/ x[rs2]\u000ard is calculated using unsigned arithmetic; rounding towards zero -p222 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p223 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero\u000aAll bits of rd are toggled -p224 -sg41 -Visacov.rv32m_divu_cg.cp_rd_value\u000aisacov.rv32m_divu_cg.cp_rd_toggle -p225 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp226 -sg15 -(lp227 -sg53 -(lp228 -sg13 -(dp229 -g56 -I0 -ssbtp230 -a(V003 -p231 -g1 -(g29 -g3 -Ntp232 -Rp233 -(dp234 -g8 -V003 -p235 -sg23 -VVP_ISA_F007_S002_I003 -p236 -sg35 -Vdivu rd, rs1, rs2\u000ax[rd] = x[rs1] u/ x[rs2]\u000ard is calculated using unsigned arithmetic; rounding towards zero -p237 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p238 -sg39 -VExercise division by zero (returns 2^32-1 ; all bits set) -p239 -sg41 -Visacov.rv32m_divu_results_cg.cp_div_zero -p240 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp241 -sg15 -(lp242 -sg53 -(lp243 -sg13 -(dp244 -g56 -I0 -ssbtp245 -asg103 -(lp246 -sg53 -(lp247 -sg13 -(dp248 -sbtp249 -a(V003_REMU -p250 -g1 -(g18 -g3 -Ntp251 -Rp252 -(dp253 -g22 -I4 -sg8 -g250 -sg23 -VVP_IP007_P003 -p254 -sg25 -(dp255 -sg12 -I3 -sg15 -(lp256 -(V000 -p257 -g1 -(g29 -g3 -Ntp258 -Rp259 -(dp260 -g8 -V000 -p261 -sg23 -VVP_ISA_F007_S003_I000 -p262 -sg35 -Vremu rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using unsigned arithmetic; remainder from the same division than DIVU -p263 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p264 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p265 -sg41 -Visacov.rv32m_remu_cg.cp_rs1\u000aisacov.rv32m_remu_cg.cp_rs2\u000aisacov.rv32m_remu_cg.cp_rd\u000aisacov.rv32m_remu_cg.cp_rd_rs1_hazard\u000aisacov.rv32m_remu_cg.cp_rd_rs2_hazard -p266 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp267 -sg15 -(lp268 -sg53 -(lp269 -sg13 -(dp270 -g56 -I0 -ssbtp271 -a(V001 -p272 -g1 -(g29 -g3 -Ntp273 -Rp274 -(dp275 -g8 -V001 -p276 -sg23 -VVP_ISA_F007_S003_I001 -p277 -sg35 -Vremu rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using unsigned arithmetic; remainder from the same division than DIVU -p278 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p279 -sg39 -VInput operands:\u000a\u000ars1 value is non-zero and zero\u000ars2 value is non-zero and zero\u000aAll combinations of rs1 and rs2 non-zero and zero values are used\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p280 -sg41 -Visacov.rv32m_remu_cg.cp_rs1_value\u000aisacov.rv32m_remu_cg.cp_rs2_value\u000aisacov.rv32m_remu_cg.cross_rs1_rs2_value\u000aisacov.rv32m_remu_cg.cp_rs1_toggle \u000aisacov.rv32m_remu_cg.cp_rs2_toggle -p281 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp282 -sg15 -(lp283 -sg53 -(lp284 -sg13 -(dp285 -g56 -I0 -ssbtp286 -a(V002 -p287 -g1 -(g29 -g3 -Ntp288 -Rp289 -(dp290 -g8 -V002 -p291 -sg23 -VVP_ISA_F007_S003_I002 -p292 -sg35 -Vremu rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using unsigned arithmetic; remainder from the same division than DIVU -p293 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p294 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero\u000aAll bits of rd are toggled -p295 -sg41 -Visacov.rv32m_remu_cg.cp_rd_value\u000aisacov.rv32m_remu_cg.cp_rd_toggle -p296 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp297 -sg15 -(lp298 -sg53 -(lp299 -sg13 -(dp300 -g56 -I0 -ssbtp301 -a(V003 -p302 -g1 -(g29 -g3 -Ntp303 -Rp304 -(dp305 -g8 -V003 -p306 -sg23 -VVP_ISA_F007_S003_I003 -p307 -sg35 -Vremu rd, rs1, rs2\u000ax[rd] = x[rs1] % x[rs2]\u000ard is calculated using unsigned arithmetic; remainder from the same division than DIVU -p308 -sg37 -VUnprivileged ISA\u000aChapter 7.2 -p309 -sg39 -VExercise division by zero (returns rs1) -p310 -sg41 -Visacov.rv32m_remu_results_cg.cp_div_zero -p311 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g48 -sg49 -g48 -sg50 -(lp312 -sg15 -(lp313 -sg53 -(lp314 -sg13 -(dp315 -g56 -I0 -ssbtp316 -asg103 -(lp317 -sg53 -(lp318 -sg13 -(dp319 -sbtp320 -asVrfu_list_0 -p321 -(lp322 -sg103 -(lp323 -sVvptool_gitrev -p324 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p325 -sVio_fmt_gitrev -p326 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p327 -sVconfig_gitrev -p328 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p329 -sVymlcfg_gitrev -p330 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p331 -sbtp332 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml new file mode 100644 index 000000000..bb6964c43 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml @@ -0,0 +1,350 @@ +!Feature +next_elt_id: 4 +name: RV32M Division Operations +id: 7 +display_order: 7 +subfeatures: !!omap +- 000_DIV: !Subfeature + name: 000_DIV + tag: VP_IP007_P000 + next_elt_id: 4 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S000_I000 + description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ + \ using signed arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_div_cg.cp_rs1\nisacov.rv32m_div_cg.cp_rs2\nisacov.rv32m_div_cg.cp_rd\n\ + isacov.rv32m_div_cg.cp_rd_rs1_hazard\nisacov.rv32m_div_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S000_I001 + description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ + \ using signed arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_div_cg.cp_rs1_value\nisacov.rv32m_div_cg.cp_rs2_value\n\ + isacov.rv32m_div_cg.cross_rs1_rs2_value\nisacov.rv32m_div_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_div_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F007_S000_I002 + description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ + \ using signed arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_div_cg.cp_rs1_value\nisacov.rv32m_div_cg.cp_rs2_value\n\ + isacov.rv32m_div_cg.cross_rs1_rs2_value\nisacov.rv32m_div_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_div_cg.cp_rs2_toggle" + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F007_S000_I003 + description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ + \ using signed arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exercise arithmetic overflow (rs1 = -2^31; rs2 = -1; returns\ + \ rd = -2^31).\nExercise division by zero (returns -1 ; all bits set)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_div_results_cg.cp_div_special_results\nisacov.rv32m_div_results_cg.cp_div_arithmetic_overflow" + comments: '' +- 001_REM: !Subfeature + name: 001_REM + tag: VP_IP007_P001 + next_elt_id: 4 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S001_I000 + description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using signed arithmetic; remainder from the same division than DIV (the\ + \ sign of rd equals the sign of rs1)" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_rem_cg.cp_rs1\nisacov.rv32m_rem_cg.cp_rs2\nisacov.rv32m_rem_cg.cp_rd\n\ + isacov.rv32m_rem_cg.cp_rd_rs1_hazard\nisacov.rv32m_rem_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S001_I001 + description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using signed arithmetic; remainder from the same division than DIV (the\ + \ sign of rd equals the sign of rs1)" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is +ve, -ve and zero\nrs2 value\ + \ is +ve, -ve and zero\nAll combinations of rs1 and rs2 +ve, -ve, and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_rem_cg.cp_rs1_value\nisacov.rv32m_rem_cg.cp_rs2_value\n\ + isacov.rv32m_rem_cg.cross_rs1_rs2_value\nisacov.rv32m_rem_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_rem_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F007_S001_I002 + description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using signed arithmetic; remainder from the same division than DIV (the\ + \ sign of rd equals the sign of rs1)" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is +ve, -ve and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_rem_cg.cp_rd_value\nisacov.rv32m_rem_cg.cp_rd_toggle" + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F007_S001_I003 + description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using signed arithmetic; remainder from the same division than DIV (the\ + \ sign of rd equals the sign of rs1)" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exercise arithmetic overflow (rs1 = -2^31; rs2 = -1; returns\ + \ rd = 0).\nExercise division by zero (returns rs1)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_rem_results_cg.cp_div_zero\nisacov.rv32m_rem_results_cg.cp_div_arithmetic_overflow" + comments: '' +- 002_DIVU: !Subfeature + name: 002_DIVU + tag: VP_IP007_P002 + next_elt_id: 4 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S002_I000 + description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_divu_cg.cp_rs1\nisacov.rv32m_divu_cg.cp_rs2\n\ + isacov.rv32m_divu_cg.cp_rd\nisacov.rv32m_divu_cg.cp_rd_rs1_hazard\nisacov.rv32m_divu_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S002_I001 + description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is non-zero and zero\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_divu_cg.cp_rs1_value\nisacov.rv32m_divu_cg.cp_rs2_value\n\ + isacov.rv32m_divu_cg.cross_rs1_rs2_value\nisacov.rv32m_divu_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_divu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F007_S002_I002 + description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_divu_cg.cp_rd_value\nisacov.rv32m_divu_cg.cp_rd_toggle" + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F007_S002_I003 + description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; rounding towards zero" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Exercise division by zero (returns 2^32-1 ; all bits set) + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32m_divu_results_cg.cp_div_zero + comments: '' +- 003_REMU: !Subfeature + name: 003_REMU + tag: VP_IP007_P003 + next_elt_id: 4 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S003_I000 + description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; remainder from the same division than DIVU" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_remu_cg.cp_rs1\nisacov.rv32m_remu_cg.cp_rs2\n\ + isacov.rv32m_remu_cg.cp_rd\nisacov.rv32m_remu_cg.cp_rd_rs1_hazard\nisacov.rv32m_remu_cg.cp_rd_rs2_hazard" + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S003_I001 + description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; remainder from the same division than DIVU" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nrs1 value is non-zero and zero\nrs2 value\ + \ is non-zero and zero\nAll combinations of rs1 and rs2 non-zero and zero\ + \ values are used\nAll bits of rs1 are toggled\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_remu_cg.cp_rs1_value\nisacov.rv32m_remu_cg.cp_rs2_value\n\ + isacov.rv32m_remu_cg.cross_rs1_rs2_value\nisacov.rv32m_remu_cg.cp_rs1_toggle\ + \ \nisacov.rv32m_remu_cg.cp_rs2_toggle" + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F007_S003_I002 + description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; remainder from the same division than DIVU" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: "isacov.rv32m_remu_cg.cp_rd_value\nisacov.rv32m_remu_cg.cp_rd_toggle" + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F007_S003_I003 + description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ + \ using unsigned arithmetic; remainder from the same division than DIVU" + reqt_doc: "Unprivileged ISA\nChapter 7.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Exercise division by zero (returns rs1) + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32m_remu_results_cg.cp_div_zero + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.pck deleted file mode 100644 index 2844a13db..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.pck +++ /dev/null @@ -1,520 +0,0 @@ -(VRV32A Load-Reserved/Store-Conditional Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I2 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I8 -sVwid_order -p12 -I8 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_LR.W -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I4 -sg8 -g17 -sVtag -p23 -VVP_IP008_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F008_S000_I000 -p34 -sVdescription -p35 -Vlr.w rd, (rs1)\u000ard = [rs1]\u000aA load occurs to address at rs1 with the results loaded to rd.\u000aMisaligned address should cause an exception -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 8.2 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_ISA_F008_S000_I001 -p62 -sg35 -Vlr.w rd, (rs1)\u000ard = [rs1]\u000aA load occurs to address at rs1 with the results loaded to rd.\u000aMisaligned address should cause an exception -p63 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p64 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled -p65 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -a(V002 -p71 -g1 -(g29 -g3 -Ntp72 -Rp73 -(dp74 -g8 -V002 -p75 -sg23 -VVP_ISA_F008_S000_I002 -p76 -sg35 -Vlr.w rd, (rs1)\u000ard = [rs1]\u000aA load occurs to address at rs1 with the results loaded to rd.\u000aMisaligned address should cause an exception -p77 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p78 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p79 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp80 -sg15 -(lp81 -sg52 -(lp82 -sg13 -(dp83 -g55 -I0 -ssbtp84 -a(V003 -p85 -g1 -(g29 -g3 -Ntp86 -Rp87 -(dp88 -g8 -V003 -p89 -sg23 -VVP_ISA_F008_S000_I003 -p90 -sg35 -Vlr.w rd, (rs1)\u000ard = [rs1]\u000aA load occurs to address at rs1 with the results loaded to rd.\u000aMisaligned address should cause an exception -p91 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p92 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exceptio -p93 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp94 -sg15 -(lp95 -sg52 -(lp96 -sg13 -(dp97 -g55 -I0 -ssbtp98 -asVrfu_list_1 -p99 -(lp100 -sg52 -(lp101 -sg13 -(dp102 -sbtp103 -a(V001_SC.W -p104 -g1 -(g18 -g3 -Ntp105 -Rp106 -(dp107 -g22 -I4 -sg8 -g104 -sg23 -VVP_IP008_P001 -p108 -sg25 -(dp109 -sg12 -I1 -sg15 -(lp110 -(V000 -p111 -g1 -(g29 -g3 -Ntp112 -Rp113 -(dp114 -g8 -V000 -p115 -sg23 -VVP_ISA_F008_S001_I000 -p116 -sg35 -Vsc.w rd, rs2, (rs1)\u000a[rs1] = rs2\u000ard = exokay ? 0 : 1\u000aA store occurs to address at rs1 with data from rs2.\u000aIf the reservation set from a previous LR.W fails, then rd is set to a non-zero value and the store does not occur.\u000aIf the reservation set passes, then rd is set to a zero-value and the store succeeds. -p117 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p118 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p119 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp120 -sg15 -(lp121 -sg52 -(lp122 -sg13 -(dp123 -g55 -I0 -ssbtp124 -a(V001 -p125 -g1 -(g29 -g3 -Ntp126 -Rp127 -(dp128 -g8 -V001 -p129 -sg23 -VVP_ISA_F008_S001_I001 -p130 -sg35 -Vsc.w rd, rs2, (rs1)\u000a[rs1] = rs2\u000ard = exokay ? 0 : 1\u000aA store occurs to address at rs1 with data from rs2.\u000aIf the reservation set from a previous LR.W fails, then rd is set to a non-zero value and the store does not occur.\u000aIf the reservation set passes, then rd is set to a zero-value and the store succeeds. -p131 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p132 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p133 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp134 -sg15 -(lp135 -sg52 -(lp136 -sg13 -(dp137 -g55 -I0 -ssbtp138 -a(V002 -p139 -g1 -(g29 -g3 -Ntp140 -Rp141 -(dp142 -g8 -V002 -p143 -sg23 -VVP_ISA_F008_S001_I002 -p144 -sg35 -Vsc.w rd, rs2, (rs1)\u000a[rs1] = rs2\u000ard = exokay ? 0 : 1\u000aA store occurs to address at rs1 with data from rs2.\u000aIf the reservation set from a previous LR.W fails, then rd is set to a non-zero value and the store does not occur.\u000aIf the reservation set passes, then rd is set to a zero-value and the store succeeds. -p145 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p146 -sg39 -VOutput result:\u000a\u000ard is either zero or non-zero to indicate success or failure, respectively -p147 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp148 -sg15 -(lp149 -sg52 -(lp150 -sg13 -(dp151 -g55 -I0 -ssbtp152 -a(V003 -p153 -g1 -(g29 -g3 -Ntp154 -Rp155 -(dp156 -g8 -V003 -p157 -sg23 -VVP_ISA_F008_S001_I003 -p158 -sg35 -Vsc.w rd, rs2, (rs1)\u000a[rs1] = rs2\u000ard = exokay ? 0 : 1\u000aA store occurs to address at rs1 with data from rs2.\u000aIf the reservation set from a previous LR.W fails, then rd is set to a non-zero value and the store does not occur.\u000aIf the reservation set passes, then rd is set to a zero-value and the store succeeds. -p159 -sg37 -VUnprivileged ISA\u000aChapter 8.2 -p160 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p161 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp162 -sg15 -(lp163 -sg52 -(lp164 -sg13 -(dp165 -g55 -I0 -ssbtp166 -asg99 -(lp167 -sg52 -(lp168 -sg13 -(dp169 -sbtp170 -asVrfu_list_0 -p171 -(lp172 -sg99 -(lp173 -sVvptool_gitrev -p174 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p175 -sVio_fmt_gitrev -p176 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p177 -sVconfig_gitrev -p178 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p179 -sVymlcfg_gitrev -p180 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p181 -sbtp182 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml new file mode 100644 index 000000000..9677eec74 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml @@ -0,0 +1,179 @@ +!Feature +next_elt_id: 2 +name: RV32A Load-Reserved/Store-Conditional Instructions +id: 8 +display_order: 8 +subfeatures: !!omap +- 000_LR.W: !Subfeature + name: 000_LR.W + tag: VP_IP008_P000 + next_elt_id: 4 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S000_I000 + description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ + \ with the results loaded to rd.\nMisaligned address should cause an exception" + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S000_I001 + description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ + \ with the results loaded to rd.\nMisaligned address should cause an exception" + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S000_I002 + description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ + \ with the results loaded to rd.\nMisaligned address should cause an exception" + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F008_S000_I003 + description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ + \ with the results loaded to rd.\nMisaligned address should cause an exception" + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exceptio" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 001_SC.W: !Subfeature + name: 001_SC.W + tag: VP_IP008_P001 + next_elt_id: 4 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S001_I000 + description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ + \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ + \ from a previous LR.W fails, then rd is set to a non-zero value and the\ + \ store does not occur.\nIf the reservation set passes, then rd is set to\ + \ a zero-value and the store succeeds." + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used.\n\ + All possible rd registers are used.\nAll possible register combinations\ + \ where rs1 == rd are used\nAll possible register combinations where rs2\ + \ == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S001_I001 + description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ + \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ + \ from a previous LR.W fails, then rd is set to a non-zero value and the\ + \ store does not occur.\nIf the reservation set passes, then rd is set to\ + \ a zero-value and the store succeeds." + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S001_I002 + description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ + \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ + \ from a previous LR.W fails, then rd is set to a non-zero value and the\ + \ store does not occur.\nIf the reservation set passes, then rd is set to\ + \ a zero-value and the store succeeds." + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd is either zero or non-zero to indicate\ + \ success or failure, respectively" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F008_S001_I003 + description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ + \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ + \ from a previous LR.W fails, then rd is set to a non-zero value and the\ + \ store does not occur.\nIf the reservation set passes, then rd is set to\ + \ a zero-value and the store succeeds." + reqt_doc: "Unprivileged ISA\nChapter 8.2" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.pck deleted file mode 100644 index 09577a56f..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.pck +++ /dev/null @@ -1,2059 +0,0 @@ -(VRV32A Atomic Memory Operations -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I9 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I9 -sVwid_order -p12 -I9 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_AMOSWAP.W -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I4 -sg8 -g17 -sVtag -p23 -VVP_IP009_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F009_S000_I000 -p34 -sVdescription -p35 -Vamoswap.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2\u000aA load occurs from the address at rs1 into rd.\u000aThe value at rs2 is then written back to the address at (rs1) -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 8.4 -p38 -sVverif_goals -p39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_ISA_F009_S000_I001 -p62 -sg35 -Vamoswap.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2\u000aA load occurs from the address at rs1 into rd.\u000aThe value at rs2 is then written back to the address at (rs1) -p63 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p64 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aZero and non-zero values of rs2 are used -p65 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -a(V002 -p71 -g1 -(g29 -g3 -Ntp72 -Rp73 -(dp74 -g8 -V002 -p75 -sg23 -VVP_ISA_F009_S000_I002 -p76 -sg35 -Vamoswap.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2\u000aA load occurs from the address at rs1 into rd.\u000aThe value at rs2 is then written back to the address at (rs1) -p77 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p78 -sg39 -VOutput result: \u000a\u000aAll bits of rd are toggled -p79 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp80 -sg15 -(lp81 -sg52 -(lp82 -sg13 -(dp83 -g55 -I0 -ssbtp84 -a(V003 -p85 -g1 -(g29 -g3 -Ntp86 -Rp87 -(dp88 -g8 -V003 -p89 -sg23 -VVP_ISA_F009_S000_I003 -p90 -sg35 -Vamoswap.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2\u000aA load occurs from the address at rs1 into rd.\u000aThe value at rs2 is then written back to the address at (rs1) -p91 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p92 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p93 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp94 -sg15 -(lp95 -sg52 -(lp96 -sg13 -(dp97 -g55 -I0 -ssbtp98 -asVrfu_list_1 -p99 -(lp100 -sg52 -(lp101 -sg13 -(dp102 -sbtp103 -a(V001_AMOADD.W -p104 -g1 -(g18 -g3 -Ntp105 -Rp106 -(dp107 -g22 -I4 -sg8 -g104 -sg23 -VVP_IP009_P001 -p108 -sg25 -(dp109 -sg12 -I1 -sg15 -(lp110 -(V000 -p111 -g1 -(g29 -g3 -Ntp112 -Rp113 -(dp114 -g8 -V000 -p115 -sg23 -VVP_ISA_F009_S001_I000 -p116 -sg35 -Vamoadd.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 + [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and added using signed arithmetic and the result iis then written back to the address at (rs1) -p117 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p118 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p119 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp120 -sg15 -(lp121 -sg52 -(lp122 -sg13 -(dp123 -g55 -I0 -ssbtp124 -a(V001 -p125 -g1 -(g29 -g3 -Ntp126 -Rp127 -(dp128 -g8 -V001 -p129 -sg23 -VVP_ISA_F009_S001_I001 -p130 -sg35 -Vamoadd.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 + [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and added using signed arithmetic and the result iis then written back to the address at (rs1) -p131 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p132 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000a+ve, -ve and zero values of rs2 are used -p133 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp134 -sg15 -(lp135 -sg52 -(lp136 -sg13 -(dp137 -g55 -I0 -ssbtp138 -a(V002 -p139 -g1 -(g29 -g3 -Ntp140 -Rp141 -(dp142 -g8 -V002 -p143 -sg23 -VVP_ISA_F009_S001_I002 -p144 -sg35 -Vamoadd.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 + [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and added using signed arithmetic and the result iis then written back to the address at (rs1) -p145 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p146 -sg39 -VOutput result: \u000a\u000a+ve, -ve and zero values of rd are used\u000aAll bits of rd are toggled -p147 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp148 -sg15 -(lp149 -sg52 -(lp150 -sg13 -(dp151 -g55 -I0 -ssbtp152 -a(V003 -p153 -g1 -(g29 -g3 -Ntp154 -Rp155 -(dp156 -g8 -V003 -p157 -sg23 -VVP_ISA_F009_S001_I003 -p158 -sg35 -Vamoadd.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 + [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and added using signed arithmetic and the result iis then written back to the address at (rs1) -p159 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p160 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p161 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp162 -sg15 -(lp163 -sg52 -(lp164 -sg13 -(dp165 -g55 -I0 -ssbtp166 -asg99 -(lp167 -sg52 -(lp168 -sg13 -(dp169 -sbtp170 -a(V002_AMOAND.W -p171 -g1 -(g18 -g3 -Ntp172 -Rp173 -(dp174 -g22 -I4 -sg8 -g171 -sg23 -VVP_IP009_P002 -p175 -sg25 -(dp176 -sg12 -I2 -sg15 -(lp177 -(V000 -p178 -g1 -(g29 -g3 -Ntp179 -Rp180 -(dp181 -g8 -V000 -p182 -sg23 -VVP_ISA_F009_S002_I000 -p183 -sg35 -Vamoand.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 & rs[1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ANDed and the result iis then written back to the address at (rs1) -p184 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p185 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p186 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp187 -sg15 -(lp188 -sg52 -(lp189 -sg13 -(dp190 -g55 -I0 -ssbtp191 -a(V001 -p192 -g1 -(g29 -g3 -Ntp193 -Rp194 -(dp195 -g8 -V001 -p196 -sg23 -VVP_ISA_F009_S002_I001 -p197 -sg35 -Vamoand.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 & rs[1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ANDed and the result iis then written back to the address at (rs1) -p198 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p199 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aZero and non-zero values of rs2 are used -p200 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp201 -sg15 -(lp202 -sg52 -(lp203 -sg13 -(dp204 -g55 -I0 -ssbtp205 -a(V002 -p206 -g1 -(g29 -g3 -Ntp207 -Rp208 -(dp209 -g8 -V002 -p210 -sg23 -VVP_ISA_F009_S002_I002 -p211 -sg35 -Vamoand.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 & rs[1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ANDed and the result iis then written back to the address at (rs1) -p212 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p213 -sg39 -VOutput result: \u000a\u000aAll bits of rd are toggled -p214 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp215 -sg15 -(lp216 -sg52 -(lp217 -sg13 -(dp218 -g55 -I0 -ssbtp219 -a(V003 -p220 -g1 -(g29 -g3 -Ntp221 -Rp222 -(dp223 -g8 -V003 -p224 -sg23 -VVP_ISA_F009_S002_I003 -p225 -sg35 -Vamoand.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 & rs[1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ANDed and the result iis then written back to the address at (rs1) -p226 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p227 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p228 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp229 -sg15 -(lp230 -sg52 -(lp231 -sg13 -(dp232 -g55 -I0 -ssbtp233 -asg99 -(lp234 -sg52 -(lp235 -sg13 -(dp236 -sbtp237 -a(V003_AMOOR.W -p238 -g1 -(g18 -g3 -Ntp239 -Rp240 -(dp241 -g22 -I4 -sg8 -g238 -sg23 -VVP_IP009_P003 -p242 -sg25 -(dp243 -sg12 -I3 -sg15 -(lp244 -(V000 -p245 -g1 -(g29 -g3 -Ntp246 -Rp247 -(dp248 -g8 -V000 -p249 -sg23 -VVP_ISA_F009_S003_I000 -p250 -sg35 -Vamoor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 | [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ORed and the result iis then written back to the address at (rs1) -p251 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p252 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p253 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp254 -sg15 -(lp255 -sg52 -(lp256 -sg13 -(dp257 -g55 -I0 -ssbtp258 -a(V001 -p259 -g1 -(g29 -g3 -Ntp260 -Rp261 -(dp262 -g8 -V001 -p263 -sg23 -VVP_ISA_F009_S003_I001 -p264 -sg35 -Vamoor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 | [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ORed and the result iis then written back to the address at (rs1) -p265 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p266 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aZero and non-zero values of rs2 are used -p267 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp268 -sg15 -(lp269 -sg52 -(lp270 -sg13 -(dp271 -g55 -I0 -ssbtp272 -a(V002 -p273 -g1 -(g29 -g3 -Ntp274 -Rp275 -(dp276 -g8 -V002 -p277 -sg23 -VVP_ISA_F009_S003_I002 -p278 -sg35 -Vamoor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 | [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ORed and the result iis then written back to the address at (rs1) -p279 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p280 -sg39 -VOutput result: \u000a\u000aAll bits of rd are toggled -p281 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp282 -sg15 -(lp283 -sg52 -(lp284 -sg13 -(dp285 -g55 -I0 -ssbtp286 -a(V003 -p287 -g1 -(g29 -g3 -Ntp288 -Rp289 -(dp290 -g8 -V003 -p291 -sg23 -VVP_ISA_F009_S003_I003 -p292 -sg35 -Vamoor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 | [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise ORed and the result iis then written back to the address at (rs1) -p293 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p294 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p295 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp296 -sg15 -(lp297 -sg52 -(lp298 -sg13 -(dp299 -g55 -I0 -ssbtp300 -asg99 -(lp301 -sg52 -(lp302 -sg13 -(dp303 -sbtp304 -a(V004_AMOXOR.W -p305 -g1 -(g18 -g3 -Ntp306 -Rp307 -(dp308 -g22 -I4 -sg8 -g305 -sg23 -VVP_IP009_P004 -p309 -sg25 -(dp310 -sg12 -I4 -sg15 -(lp311 -(V000 -p312 -g1 -(g29 -g3 -Ntp313 -Rp314 -(dp315 -g8 -V000 -p316 -sg23 -VVP_ISA_F009_S004_I000 -p317 -sg35 -Vamoxor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 ^ [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise XORRed and the result iis then written back to the address at (rs1) -p318 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p319 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p320 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp321 -sg15 -(lp322 -sg52 -(lp323 -sg13 -(dp324 -g55 -I0 -ssbtp325 -a(V001 -p326 -g1 -(g29 -g3 -Ntp327 -Rp328 -(dp329 -g8 -V001 -p330 -sg23 -VVP_ISA_F009_S004_I001 -p331 -sg35 -Vamoxor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 ^ [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise XORRed and the result iis then written back to the address at (rs1) -p332 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p333 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000aZero and non-zero values of rs2 are used -p334 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp335 -sg15 -(lp336 -sg52 -(lp337 -sg13 -(dp338 -g55 -I0 -ssbtp339 -a(V002 -p340 -g1 -(g29 -g3 -Ntp341 -Rp342 -(dp343 -g8 -V002 -p344 -sg23 -VVP_ISA_F009_S004_I002 -p345 -sg35 -Vamoxor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 ^ [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise XORRed and the result iis then written back to the address at (rs1) -p346 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p347 -sg39 -VOutput result: \u000a\u000aAll bits of rd are toggled -p348 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp349 -sg15 -(lp350 -sg52 -(lp351 -sg13 -(dp352 -g55 -I0 -ssbtp353 -a(V003 -p354 -g1 -(g29 -g3 -Ntp355 -Rp356 -(dp357 -g8 -V003 -p358 -sg23 -VVP_ISA_F009_S004_I003 -p359 -sg35 -Vamoxor.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = rs2 ^ [rs1]\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and bit-wise XORRed and the result iis then written back to the address at (rs1) -p360 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p361 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p362 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp363 -sg15 -(lp364 -sg52 -(lp365 -sg13 -(dp366 -g55 -I0 -ssbtp367 -asg99 -(lp368 -sg52 -(lp369 -sg13 -(dp370 -sbtp371 -a(V005_AMOMAX.W -p372 -g1 -(g18 -g3 -Ntp373 -Rp374 -(dp375 -g22 -I4 -sg8 -g372 -sg23 -VVP_IP009_P005 -p376 -sg25 -(dp377 -sg12 -I5 -sg15 -(lp378 -(V000 -p379 -g1 -(g29 -g3 -Ntp380 -Rp381 -(dp382 -g8 -V000 -p383 -sg23 -VVP_ISA_F009_S005_I000 -p384 -sg35 -Vamomax.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the largest value is then written back to the address at (rs1) -p385 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p386 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p387 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp388 -sg15 -(lp389 -sg52 -(lp390 -sg13 -(dp391 -g55 -I0 -ssbtp392 -a(V001 -p393 -g1 -(g29 -g3 -Ntp394 -Rp395 -(dp396 -g8 -V001 -p397 -sg23 -VVP_ISA_F009_S005_I001 -p398 -sg35 -Vamomax.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the largest value is then written back to the address at (rs1) -p399 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p400 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled\u000a+ve, -ve and zero values of rs2 are used -p401 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp402 -sg15 -(lp403 -sg52 -(lp404 -sg13 -(dp405 -g55 -I0 -ssbtp406 -a(V002 -p407 -g1 -(g29 -g3 -Ntp408 -Rp409 -(dp410 -g8 -g407 -sg23 -VVP_ISA_F009_S005_I002 -p411 -sg35 -Vamomax.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the largest value is then written back to the address at (rs1) -p412 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p413 -sg39 -VOutput result: \u000a\u000a+ve, -ve and zero values of rd are used\u000aAll bits of rd are toggled -p414 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp415 -sg15 -(lp416 -sg52 -(lp417 -sg13 -(dp418 -g55 -I0 -ssbtp419 -a(V003 -p420 -g1 -(g29 -g3 -Ntp421 -Rp422 -(dp423 -g8 -V003 -p424 -sg23 -VVP_ISA_F009_S005_I003 -p425 -sg35 -Vamomax.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the largest value is then written back to the address at (rs1) -p426 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p427 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p428 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp429 -sg15 -(lp430 -sg52 -(lp431 -sg13 -(dp432 -g55 -I0 -ssbtp433 -asg99 -(lp434 -sg52 -(lp435 -sg13 -(dp436 -sbtp437 -a(V006_AMOMAXU.W -p438 -g1 -(g18 -g3 -Ntp439 -Rp440 -(dp441 -g22 -I4 -sg8 -g438 -sg23 -VVP_IP009_P006 -p442 -sg25 -(dp443 -sg12 -I6 -sg15 -(lp444 -(V000 -p445 -g1 -(g29 -g3 -Ntp446 -Rp447 -(dp448 -g8 -V000 -p449 -sg23 -VVP_ISA_F009_S006_I000 -p450 -sg35 -Vamomaxu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the largest value is then written back to the address at (rs1) -p451 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p452 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p453 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp454 -sg15 -(lp455 -sg52 -(lp456 -sg13 -(dp457 -g55 -I0 -ssbtp458 -a(V001 -p459 -g1 -(g29 -g3 -Ntp460 -Rp461 -(dp462 -g8 -V001 -p463 -sg23 -VVP_ISA_F009_S006_I001 -p464 -sg35 -Vamomaxu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the largest value is then written back to the address at (rs1) -p465 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p466 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p467 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp468 -sg15 -(lp469 -sg52 -(lp470 -sg13 -(dp471 -g55 -I0 -ssbtp472 -a(V002 -p473 -g1 -(g29 -g3 -Ntp474 -Rp475 -(dp476 -g8 -V002 -p477 -sg23 -VVP_ISA_F009_S006_I002 -p478 -sg35 -Vamomaxu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the largest value is then written back to the address at (rs1) -p479 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p480 -sg39 -VOutput result: \u000a\u000aAll bits of rd are toggled -p481 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp482 -sg15 -(lp483 -sg52 -(lp484 -sg13 -(dp485 -g55 -I0 -ssbtp486 -a(V003 -p487 -g1 -(g29 -g3 -Ntp488 -Rp489 -(dp490 -g8 -V003 -p491 -sg23 -VVP_ISA_F009_S006_I003 -p492 -sg35 -Vamomaxu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = max_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the largest value is then written back to the address at (rs1) -p493 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p494 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p495 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp496 -sg15 -(lp497 -sg52 -(lp498 -sg13 -(dp499 -g55 -I0 -ssbtp500 -asg99 -(lp501 -sg52 -(lp502 -sg13 -(dp503 -sbtp504 -a(V007_AMOMIN.W -p505 -g1 -(g18 -g3 -Ntp506 -Rp507 -(dp508 -g22 -I4 -sg8 -g505 -sg23 -VVP_IP009_P007 -p509 -sg25 -(dp510 -sg12 -I7 -sg15 -(lp511 -(V000 -p512 -g1 -(g29 -g3 -Ntp513 -Rp514 -(dp515 -g8 -V000 -p516 -sg23 -VVP_ISA_F009_S007_I000 -p517 -sg35 -Vamomin.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the smaller value is then written back to the address at (rs1) -p518 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p519 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p520 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp521 -sg15 -(lp522 -sg52 -(lp523 -sg13 -(dp524 -g55 -I0 -ssbtp525 -a(V001 -p526 -g1 -(g29 -g3 -Ntp527 -Rp528 -(dp529 -g8 -V001 -p530 -sg23 -VVP_ISA_F009_S007_I001 -p531 -sg35 -Vamomin.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the smaller value is then written back to the address at (rs1) -p532 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p533 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p534 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp535 -sg15 -(lp536 -sg52 -(lp537 -sg13 -(dp538 -g55 -I0 -ssbtp539 -a(V002 -p540 -g1 -(g29 -g3 -Ntp541 -Rp542 -(dp543 -g8 -V002 -p544 -sg23 -VVP_ISA_F009_S007_I002 -p545 -sg35 -Vamomin.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the smaller value is then written back to the address at (rs1) -p546 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p547 -sg39 -VOutput result: \u000a\u000a+ve, -ve and zero values of rd are used\u000aAll bits of rd are toggled -p548 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp549 -sg15 -(lp550 -sg52 -(lp551 -sg13 -(dp552 -g55 -I0 -ssbtp553 -a(V003 -p554 -g1 -(g29 -g3 -Ntp555 -Rp556 -(dp557 -g8 -V003 -p558 -sg23 -VVP_ISA_F009_S007_I003 -p559 -sg35 -Vamomin.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_signed(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming signed numbers and the smaller value is then written back to the address at (rs1) -p560 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p561 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p562 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp563 -sg15 -(lp564 -sg52 -(lp565 -sg13 -(dp566 -g55 -I0 -ssbtp567 -asg99 -(lp568 -sg52 -(lp569 -sg13 -(dp570 -sbtp571 -a(V008_AMOMINU.W -p572 -g1 -(g18 -g3 -Ntp573 -Rp574 -(dp575 -g22 -I4 -sg8 -g572 -sg23 -VVP_IP009_P008 -p576 -sg25 -(dp577 -sg12 -I8 -sg15 -(lp578 -(V000 -p579 -g1 -(g29 -g3 -Ntp580 -Rp581 -(dp582 -g8 -V000 -p583 -sg23 -VVP_ISA_F009_S008_I000 -p584 -sg35 -Vamominu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the smaller value is then written back to the address at (rs1) -p585 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p586 -sg39 -VInput operands:\u000a\u000aAll possible rs1 registers are used.\u000aAll possible rs2 registers are used.\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs1 == rd are used\u000aAll possible register combinations where rs2 == rd are used -p587 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp588 -sg15 -(lp589 -sg52 -(lp590 -sg13 -(dp591 -g55 -I0 -ssbtp592 -a(V001 -p593 -g1 -(g29 -g3 -Ntp594 -Rp595 -(dp596 -g8 -V001 -p597 -sg23 -VVP_ISA_F009_S008_I001 -p598 -sg35 -Vamominu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the smaller value is then written back to the address at (rs1) -p599 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p600 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled\u000aAll bits of rs2 are toggled -p601 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp602 -sg15 -(lp603 -sg52 -(lp604 -sg13 -(dp605 -g55 -I0 -ssbtp606 -a(V002 -p607 -g1 -(g29 -g3 -Ntp608 -Rp609 -(dp610 -g8 -V002 -p611 -sg23 -VVP_ISA_F009_S008_I002 -p612 -sg35 -Vamominu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the smaller value is then written back to the address at (rs1) -p613 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p614 -sg39 -VOutput result: \u000a\u000aAll bits of rd are toggled -p615 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp616 -sg15 -(lp617 -sg52 -(lp618 -sg13 -(dp619 -g55 -I0 -ssbtp620 -a(V003 -p621 -g1 -(g29 -g3 -Ntp622 -Rp623 -(dp624 -g8 -V003 -p625 -sg23 -VVP_ISA_F009_S008_I003 -p626 -sg35 -Vamominu.w rd, rs2, (rs1)\u000ard = [rs1]\u000a[rs1] = min_unsigned(rs2, [rs1])\u000aA load occurs from the address at rs1 into rd.\u000aThe values in rd and rs2 and compared assuming unsigned numbers and the smaller value is then written back to the address at (rs1) -p627 -sg37 -VUnprivileged ISA\u000aChapter 8.4 -p628 -sg39 -VException:\u000a\u000aMisaligned address (non-32-bit aligned) will always cause exception -p629 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp630 -sg15 -(lp631 -sg52 -(lp632 -sg13 -(dp633 -g55 -I0 -ssbtp634 -asg99 -(lp635 -sg52 -(lp636 -sg13 -(dp637 -sbtp638 -asVrfu_list_0 -p639 -(lp640 -sg99 -(lp641 -sVvptool_gitrev -p642 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p643 -sVio_fmt_gitrev -p644 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p645 -sVconfig_gitrev -p646 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p647 -sVymlcfg_gitrev -p648 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p649 -sbtp650 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml new file mode 100644 index 000000000..3c1a267e4 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml @@ -0,0 +1,788 @@ +!Feature +next_elt_id: 9 +name: RV32A Atomic Memory Operations +id: 9 +display_order: 9 +subfeatures: !!omap +- 000_AMOSWAP.W: !Subfeature + name: 000_AMOSWAP.W + tag: VP_IP009_P000 + next_elt_id: 4 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S000_I000 + description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ + \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S000_I001 + description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ + \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled\nZero and non-zero values of rs2 are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S000_I002 + description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ + \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S000_I003 + description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ + \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 001_AMOADD.W: !Subfeature + name: 001_AMOADD.W + tag: VP_IP009_P001 + next_elt_id: 4 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S001_I000 + description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and added using signed arithmetic and the result iis then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S001_I001 + description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and added using signed arithmetic and the result iis then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled\n+ve, -ve and zero values of rs2 are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S001_I002 + description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and added using signed arithmetic and the result iis then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\n+ve, -ve and zero values of rd are used\n\ + All bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S001_I003 + description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and added using signed arithmetic and the result iis then written back\ + \ to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 002_AMOAND.W: !Subfeature + name: 002_AMOAND.W + tag: VP_IP009_P002 + next_elt_id: 4 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S002_I000 + description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise ANDed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S002_I001 + description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise ANDed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled\nZero and non-zero values of rs2 are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S002_I002 + description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise ANDed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S002_I003 + description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise ANDed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 003_AMOOR.W: !Subfeature + name: 003_AMOOR.W + tag: VP_IP009_P003 + next_elt_id: 4 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S003_I000 + description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ + \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ + \ bit-wise ORed and the result iis then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S003_I001 + description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ + \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ + \ bit-wise ORed and the result iis then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled\nZero and non-zero values of rs2 are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S003_I002 + description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ + \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ + \ bit-wise ORed and the result iis then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S003_I003 + description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ + \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ + \ bit-wise ORed and the result iis then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 004_AMOXOR.W: !Subfeature + name: 004_AMOXOR.W + tag: VP_IP009_P004 + next_elt_id: 4 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S004_I000 + description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise XORRed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S004_I001 + description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise XORRed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled\nZero and non-zero values of rs2 are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S004_I002 + description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise XORRed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S004_I003 + description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ + \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ + \ and bit-wise XORRed and the result iis then written back to the address\ + \ at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 005_AMOMAX.W: !Subfeature + name: 005_AMOMAX.W + tag: VP_IP009_P005 + next_elt_id: 4 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S005_I000 + description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S005_I001 + description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled\n+ve, -ve and zero values of rs2 are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S005_I002 + description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\n+ve, -ve and zero values of rd are used\n\ + All bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S005_I003 + description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 006_AMOMAXU.W: !Subfeature + name: 006_AMOMAXU.W + tag: VP_IP009_P006 + next_elt_id: 4 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S006_I000 + description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S006_I001 + description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S006_I002 + description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S006_I003 + description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the largest value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 007_AMOMIN.W: !Subfeature + name: 007_AMOMIN.W + tag: VP_IP009_P007 + next_elt_id: 4 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S007_I000 + description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S007_I001 + description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S007_I002 + description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\n+ve, -ve and zero values of rd are used\n\ + All bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S007_I003 + description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming signed numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 008_AMOMINU.W: !Subfeature + name: 008_AMOMINU.W + tag: VP_IP009_P008 + next_elt_id: 4 + display_order: 8 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S008_I000 + description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll possible rs1 registers are used.\nAll\ + \ possible rs2 registers are used.\nAll possible rd registers are used.\n\ + All possible register combinations where rs1 == rd are used\nAll possible\ + \ register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S008_I001 + description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled\nAll bits of\ + \ rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S008_I002 + description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result: \n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_ISA_F009_S008_I003 + description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ + \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ + \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ + \ is then written back to the address at (rs1)" + reqt_doc: "Unprivileged ISA\nChapter 8.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Exception:\n\nMisaligned address (non-32-bit aligned) will always\ + \ cause exception" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.pck deleted file mode 100644 index 997752667..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.pck +++ /dev/null @@ -1,2592 +0,0 @@ -(VRV32C Integer Computational Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I16 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I10 -sVwid_order -p12 -I10 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_C.LI -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I2 -sg8 -g17 -sVtag -p23 -VVP_IP008_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F008_S000_I000 -p34 -sVdescription -p35 -Vc.li rd, imm[5:0]\u000ax[rd] = sext(imm)\u000aExpands to addi rd, x0, imm[5:0]. Invalid when rd=x0.\u000ard is calculated using signed arithmetic -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 16.5 -p38 -sVverif_goals -p39 -VInput operands:\u000a\u000aAll bits of imm[5:0] are toggled -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_ISA_F008_S000_I001 -p62 -sg35 -Vc.li rd, imm[5:0]\u000ax[rd] = sext(imm)\u000aExpands to addi rd, x0, imm[5:0]. Invalid when rd=x0.\u000ard is calculated using signed arithmetic -p63 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p64 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p65 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -asVrfu_list_1 -p71 -(lp72 -sg52 -(lp73 -sg13 -(dp74 -sbtp75 -a(V001_C.LUI -p76 -g1 -(g18 -g3 -Ntp77 -Rp78 -(dp79 -g22 -I2 -sg8 -g76 -sg23 -VVP_IP008_P001 -p80 -sg25 -(dp81 -sg12 -I1 -sg15 -(lp82 -(V000 -p83 -g1 -(g29 -g3 -Ntp84 -Rp85 -(dp86 -g8 -V000 -p87 -sg23 -VVP_ISA_F008_S001_I000 -p88 -sg35 -Vc.lui rd, nzimm[17:12]\u000ax[rd] = sext(nzimm[17:12] << 12)\u000aExpands to lui rd, nzimm[17:12]. Invalid when rd = {x0, x2} or imm = 0.\u000ard is calculated using signed arithmetic. -p89 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p90 -sg39 -VInput operands:\u000a\u000aAll bits of imm[17:12] are toggled -p91 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp92 -sg15 -(lp93 -sg52 -(lp94 -sg13 -(dp95 -g55 -I0 -ssbtp96 -a(V001 -p97 -g1 -(g29 -g3 -Ntp98 -Rp99 -(dp100 -g8 -V001 -p101 -sg23 -VVP_ISA_F008_S001_I001 -p102 -sg35 -Vc.lui rd, nzimm[17:12]\u000ax[rd] = sext(nzimm[17:12] << 12)\u000aExpands to lui rd, nzimm[17:12]. Invalid when rd = {x0, x2} or imm = 0.\u000ard is calculated using signed arithmetic. -p103 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p104 -sg39 -VOutput result:\u000a\u000aAll bits of rd[31:12] are toggled -p105 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp106 -sg15 -(lp107 -sg52 -(lp108 -sg13 -(dp109 -g55 -I0 -ssbtp110 -asg71 -(lp111 -sg52 -(lp112 -sg13 -(dp113 -sbtp114 -a(V002_C.ADDI -p115 -g1 -(g18 -g3 -Ntp116 -Rp117 -(dp118 -g22 -I3 -sg8 -g115 -sg23 -VVP_IP008_P002 -p119 -sg25 -(dp120 -sg12 -I2 -sg15 -(lp121 -(V000 -p122 -g1 -(g29 -g3 -Ntp123 -Rp124 -(dp125 -g8 -V000 -p126 -sg23 -VVP_ISA_F008_S002_I000 -p127 -sg35 -Vc.addi rd, nzimm[5:0]\u000ax[rd] = x[rd] + sext(nzimm[5:0])\u000aExpands to addi rd, rd, nzimm[5:0].\u000aInvalid when rd=x0 or nzimm = 0. Arithmetic overflow is lost and ignored.\u000ard is calculated using signed arithmetic. -p128 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p129 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p130 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp131 -sg15 -(lp132 -sg52 -(lp133 -sg13 -(dp134 -g55 -I0 -ssbtp135 -a(V001 -p136 -g1 -(g29 -g3 -Ntp137 -Rp138 -(dp139 -g8 -V001 -p140 -sg23 -VVP_ISA_F008_S002_I001 -p141 -sg35 -Vc.addi rd, nzimm[5:0]\u000ax[rd] = x[rd] + sext(nzimm[5:0])\u000aExpands to addi rd, rd, nzimm[5:0].\u000aInvalid when rd=x0 or nzimm = 0. Arithmetic overflow is lost and ignored.\u000ard is calculated using signed arithmetic. -p142 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p143 -sg39 -VInput operands:\u000a\u000aAll inputs bits of rd before instruction execution are toggled\u000aAll bits of nzimm are toggled -p144 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp145 -sg15 -(lp146 -sg52 -(lp147 -sg13 -(dp148 -g55 -I0 -ssbtp149 -a(V002 -p150 -g1 -(g29 -g3 -Ntp151 -Rp152 -(dp153 -g8 -V002 -p154 -sg23 -VVP_ISA_F008_S002_I002 -p155 -sg35 -Vc.addi rd, nzimm[5:0]\u000ax[rd] = x[rd] + sext(nzimm[5:0])\u000aExpands to addi rd, rd, nzimm[5:0].\u000aInvalid when rd=x0 or nzimm = 0. Arithmetic overflow is lost and ignored.\u000ard is calculated using signed arithmetic. -p156 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p157 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p158 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp159 -sg15 -(lp160 -sg52 -(lp161 -sg13 -(dp162 -g55 -I0 -ssbtp163 -asg71 -(lp164 -sg52 -(lp165 -sg13 -(dp166 -sbtp167 -a(V003_C.ADDI16SP -p168 -g1 -(g18 -g3 -Ntp169 -Rp170 -(dp171 -g22 -I3 -sg8 -g168 -sg23 -VVP_IP008_P003 -p172 -sg25 -(dp173 -sg12 -I3 -sg15 -(lp174 -(V000 -p175 -g1 -(g29 -g3 -Ntp176 -Rp177 -(dp178 -g8 -V000 -p179 -sg23 -VVP_ISA_F008_S003_I000 -p180 -sg35 -Vc.addi16sp nzimm[9:4]\u000ax[2] = x[2] + sext(nzimm[9:4])\u000aExpands to addi x2, x2, nzimm[9:4]. Invalid when nzimm=0.\u000ard is calculated using signed arithmetic. -p181 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p182 -sg39 -VInput operands:\u000a\u000a+ve and -ve values of nzimm are used\u000aAll bits of nzimm[9:4] are toggled\u000aAll bits of x2 before instruction execution are toggled -p183 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp184 -sg15 -(lp185 -sg52 -(lp186 -sg13 -(dp187 -g55 -I0 -ssbtp188 -a(V001 -p189 -g1 -(g29 -g3 -Ntp190 -Rp191 -(dp192 -g8 -V001 -p193 -sg23 -VVP_ISA_F008_S003_I001 -p194 -sg35 -Vc.addi16sp nzimm[9:4]\u000ax[2] = x[2] + sext(nzimm[9:4])\u000aExpands to addi x2, x2, nzimm[9:4]. Invalid when nzimm=0.\u000ard is calculated using signed arithmetic. -p195 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p196 -sg39 -VOutput result:\u000a\u000aAll bits of x2 are toggled -p197 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp198 -sg15 -(lp199 -sg52 -(lp200 -sg13 -(dp201 -g55 -I0 -ssbtp202 -asg71 -(lp203 -sg52 -(lp204 -sg13 -(dp205 -sbtp206 -a(V004_C.ADDI4SPN -p207 -g1 -(g18 -g3 -Ntp208 -Rp209 -(dp210 -g22 -I3 -sg8 -g207 -sg23 -VVP_IP008_P004 -p211 -sg25 -(dp212 -sg12 -I4 -sg15 -(lp213 -(V000 -p214 -g1 -(g29 -g3 -Ntp215 -Rp216 -(dp217 -g8 -V000 -p218 -sg23 -VVP_ISA_F008_S004_I000 -p219 -sg35 -Vc.addi4spn rd', nzuimm[9:2]\u000ax[8+rd'] = x[2] + nzuimm[9:2]\u000aExpands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\u000ard is calculated using signed arithmetic. -p220 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p221 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p222 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp223 -sg15 -(lp224 -sg52 -(lp225 -sg13 -(dp226 -g55 -I0 -ssbtp227 -a(V001 -p228 -g1 -(g29 -g3 -Ntp229 -Rp230 -(dp231 -g8 -V001 -p232 -sg23 -VVP_ISA_F008_S004_I001 -p233 -sg35 -Vc.addi4spn rd', nzuimm[9:2]\u000ax[8+rd'] = x[2] + nzuimm[9:2]\u000aExpands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\u000ard is calculated using signed arithmetic. -p234 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p235 -sg39 -VInput operands:\u000a\u000aAll bits of nzuimm[9:2] are toggled\u000aAll bits of x2 before instruction execution are toggled -p236 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp237 -sg15 -(lp238 -sg52 -(lp239 -sg13 -(dp240 -g55 -I0 -ssbtp241 -a(V002 -p242 -g1 -(g29 -g3 -Ntp243 -Rp244 -(dp245 -g8 -V002 -p246 -sg23 -VVP_ISA_F008_S004_I002 -p247 -sg35 -Vc.addi4spn rd', nzuimm[9:2]\u000ax[8+rd'] = x[2] + nzuimm[9:2]\u000aExpands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\u000ard is calculated using signed arithmetic. -p248 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p249 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p250 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp251 -sg15 -(lp252 -sg52 -(lp253 -sg13 -(dp254 -g55 -I0 -ssbtp255 -asg71 -(lp256 -sg52 -(lp257 -sg13 -(dp258 -sbtp259 -a(V005_C.SLLI -p260 -g1 -(g18 -g3 -Ntp261 -Rp262 -(dp263 -g22 -I3 -sg8 -g260 -sg23 -VVP_IP008_P005 -p264 -sg25 -(dp265 -sg12 -I5 -sg15 -(lp266 -(V000 -p267 -g1 -(g29 -g3 -Ntp268 -Rp269 -(dp270 -g8 -V000 -p271 -sg23 -VVP_ISA_F008_S005_I000 -p272 -sg35 -Vc.slli rd, uimm[5:0]\u000ax[rd] = x[rd] << uimm[5:0]\u000aExpands to slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0. -p273 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p274 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p275 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp276 -sg15 -(lp277 -sg52 -(lp278 -sg13 -(dp279 -g55 -I0 -ssbtp280 -a(V001 -p281 -g1 -(g29 -g3 -Ntp282 -Rp283 -(dp284 -g8 -V001 -p285 -sg23 -VVP_ISA_F008_S005_I001 -p286 -sg35 -Vc.slli rd, uimm[5:0]\u000ax[rd] = x[rd] << uimm[5:0]\u000aExpands to slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0. -p287 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p288 -sg39 -VInput operands:\u000a\u000aAll shift amounts from [0:31] are used\u000aAll bits of rd before instruction execution are toggled -p289 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp290 -sg15 -(lp291 -sg52 -(lp292 -sg13 -(dp293 -g55 -I0 -ssbtp294 -a(V002 -p295 -g1 -(g29 -g3 -Ntp296 -Rp297 -(dp298 -g8 -V002 -p299 -sg23 -VVP_ISA_F008_S005_I002 -p300 -sg35 -Vc.slli rd, uimm[5:0]\u000ax[rd] = x[rd] << uimm[5:0]\u000aExpands to slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0. -p301 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p302 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p303 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp304 -sg15 -(lp305 -sg52 -(lp306 -sg13 -(dp307 -g55 -I0 -ssbtp308 -asg71 -(lp309 -sg52 -(lp310 -sg13 -(dp311 -sbtp312 -a(V006_C.SRLI -p313 -g1 -(g18 -g3 -Ntp314 -Rp315 -(dp316 -g22 -I3 -sg8 -g313 -sg23 -VVP_IP008_P006 -p317 -sg25 -(dp318 -sg12 -I6 -sg15 -(lp319 -(V000 -p320 -g1 -(g29 -g3 -Ntp321 -Rp322 -(dp323 -g8 -V000 -p324 -sg23 -VVP_ISA_F008_S006_I000 -p325 -sg35 -Vc.srli rd', uimm[5:0]\u000ax[8+rd'] = x[8+rd'] >>u uimm[5:0]\u000aExpands to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, -p326 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p327 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p328 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp329 -sg15 -(lp330 -sg52 -(lp331 -sg13 -(dp332 -g55 -I0 -ssbtp333 -a(V001 -p334 -g1 -(g29 -g3 -Ntp335 -Rp336 -(dp337 -g8 -V001 -p338 -sg23 -VVP_ISA_F008_S006_I001 -p339 -sg35 -Vc.srli rd', uimm[5:0]\u000ax[8+rd'] = x[8+rd'] >>u uimm[5:0]\u000aExpands to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, -p340 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p341 -sg39 -VInput operands:\u000a\u000aAll shift amounts from [0:31] are used\u000aAll bits of rd before instruction execution are toggled -p342 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp343 -sg15 -(lp344 -sg52 -(lp345 -sg13 -(dp346 -g55 -I0 -ssbtp347 -a(V002 -p348 -g1 -(g29 -g3 -Ntp349 -Rp350 -(dp351 -g8 -V002 -p352 -sg23 -VVP_ISA_F008_S006_I002 -p353 -sg35 -Vc.srli rd', uimm[5:0]\u000ax[8+rd'] = x[8+rd'] >>u uimm[5:0]\u000aExpands to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, -p354 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p355 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p356 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp357 -sg15 -(lp358 -sg52 -(lp359 -sg13 -(dp360 -g55 -I0 -ssbtp361 -asg71 -(lp362 -sg52 -(lp363 -sg13 -(dp364 -sbtp365 -a(V007_C.SRAI -p366 -g1 -(g18 -g3 -Ntp367 -Rp368 -(dp369 -g22 -I3 -sg8 -g366 -sg23 -VVP_IP008_P007 -p370 -sg25 -(dp371 -sg12 -I7 -sg15 -(lp372 -(V000 -p373 -g1 -(g29 -g3 -Ntp374 -Rp375 -(dp376 -g8 -V000 -p377 -sg23 -VVP_ISA_F008_S007_I000 -p378 -sg35 -Vc.srai rd', uimm[5:0]\u000ax[8+rd'] = x[8+rd'] >> uimm[5:0]\u000aExpands to srai rd', rd', uimm[5:0]. -p379 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p380 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p381 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp382 -sg15 -(lp383 -sg52 -(lp384 -sg13 -(dp385 -g55 -I0 -ssbtp386 -a(V001 -p387 -g1 -(g29 -g3 -Ntp388 -Rp389 -(dp390 -g8 -V001 -p391 -sg23 -VVP_ISA_F008_S007_I001 -p392 -sg35 -Vc.srai rd', uimm[5:0]\u000ax[8+rd'] = x[8+rd'] >> uimm[5:0]\u000aExpands to srai rd', rd', uimm[5:0]. -p393 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p394 -sg39 -VInput operands:\u000a\u000aAll shift amounts from [0:31] are used\u000a+ve, -ve and zero values of rd` are used\u000aAll bits of rd` before instruction execution are toggled -p395 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp396 -sg15 -(lp397 -sg52 -(lp398 -sg13 -(dp399 -g55 -I0 -ssbtp400 -a(V002 -p401 -g1 -(g29 -g3 -Ntp402 -Rp403 -(dp404 -g8 -V002 -p405 -sg23 -VVP_ISA_F008_S007_I002 -p406 -sg35 -Vc.srai rd', uimm[5:0]\u000ax[8+rd'] = x[8+rd'] >> uimm[5:0]\u000aExpands to srai rd', rd', uimm[5:0]. -p407 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p408 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p409 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp410 -sg15 -(lp411 -sg52 -(lp412 -sg13 -(dp413 -g55 -I0 -ssbtp414 -asg71 -(lp415 -sg52 -(lp416 -sg13 -(dp417 -sbtp418 -a(V008_C.ANDI -p419 -g1 -(g18 -g3 -Ntp420 -Rp421 -(dp422 -g22 -I3 -sg8 -g419 -sg23 -VVP_IP008_P008 -p423 -sg25 -(dp424 -sg12 -I8 -sg15 -(lp425 -(V000 -p426 -g1 -(g29 -g3 -Ntp427 -Rp428 -(dp429 -g8 -V000 -p430 -sg23 -VVP_ISA_F008_S008_I000 -p431 -sg35 -Vc.andi rd', imm[5:0]\u000ax[8+rd'] = x[8+rd'] & sext(imm[5:0])\u000aExpands to andi rd', rd', imm[5:0].\u000aimm treated as signed number -p432 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p433 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p434 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp435 -sg15 -(lp436 -sg52 -(lp437 -sg13 -(dp438 -g55 -I0 -ssbtp439 -a(V001 -p440 -g1 -(g29 -g3 -Ntp441 -Rp442 -(dp443 -g8 -V001 -p444 -sg23 -VVP_ISA_F008_S008_I001 -p445 -sg35 -Vc.andi rd', imm[5:0]\u000ax[8+rd'] = x[8+rd'] & sext(imm[5:0])\u000aExpands to andi rd', rd', imm[5:0].\u000aimm treated as signed number -p446 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p447 -sg39 -VInput operands:\u000a\u000aAll shift amounts from [0:31] are used\u000a+ve, -ve and zero values of imm are used\u000aAll bits of rd` before instruction execution are toggled -p448 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp449 -sg15 -(lp450 -sg52 -(lp451 -sg13 -(dp452 -g55 -I0 -ssbtp453 -a(V002 -p454 -g1 -(g29 -g3 -Ntp455 -Rp456 -(dp457 -g8 -V002 -p458 -sg23 -VVP_ISA_F008_S008_I002 -p459 -sg35 -Vc.andi rd', imm[5:0]\u000ax[8+rd'] = x[8+rd'] & sext(imm[5:0])\u000aExpands to andi rd', rd', imm[5:0].\u000aimm treated as signed number -p460 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p461 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p462 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp463 -sg15 -(lp464 -sg52 -(lp465 -sg13 -(dp466 -g55 -I0 -ssbtp467 -asg71 -(lp468 -sg52 -(lp469 -sg13 -(dp470 -sbtp471 -a(V009_C.MV -p472 -g1 -(g18 -g3 -Ntp473 -Rp474 -(dp475 -g22 -I3 -sg8 -g472 -sg23 -VVP_IP008_P009 -p476 -sg25 -(dp477 -sg12 -I9 -sg15 -(lp478 -(V000 -p479 -g1 -(g29 -g3 -Ntp480 -Rp481 -(dp482 -g8 -V000 -p483 -sg23 -VVP_ISA_F008_S009_I000 -p484 -sg35 -Vc.mv rd, rs2\u000ax[rd] = x[rs2]\u000aExpands to add rd, x0, rs2\u000aInvalid when rs2=x0 or rd=x0. -p485 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p486 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used.\u000aAll possible register combinations where rs2 == rd are used -p487 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp488 -sg15 -(lp489 -sg52 -(lp490 -sg13 -(dp491 -g55 -I0 -ssbtp492 -a(V001 -p493 -g1 -(g29 -g3 -Ntp494 -Rp495 -(dp496 -g8 -V001 -p497 -sg23 -VVP_ISA_F008_S009_I001 -p498 -sg35 -Vc.mv rd, rs2\u000ax[rd] = x[rs2]\u000aExpands to add rd, x0, rs2\u000aInvalid when rs2=x0 or rd=x0. -p499 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p500 -sg39 -VInput operands:\u000a\u000aAll bits of rs2 are toggled -p501 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp502 -sg15 -(lp503 -sg52 -(lp504 -sg13 -(dp505 -g55 -I0 -ssbtp506 -a(V002 -p507 -g1 -(g29 -g3 -Ntp508 -Rp509 -(dp510 -g8 -V002 -p511 -sg23 -VVP_ISA_F008_S009_I002 -p512 -sg35 -Vc.mv rd, rs2\u000ax[rd] = x[rs2]\u000aExpands to add rd, x0, rs2\u000aInvalid when rs2=x0 or rd=x0. -p513 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p514 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled -p515 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp516 -sg15 -(lp517 -sg52 -(lp518 -sg13 -(dp519 -g55 -I0 -ssbtp520 -asg71 -(lp521 -sg52 -(lp522 -sg13 -(dp523 -sbtp524 -a(V010_C.ADD -p525 -g1 -(g18 -g3 -Ntp526 -Rp527 -(dp528 -g22 -I3 -sg8 -g525 -sg23 -VVP_IP008_P010 -p529 -sg25 -(dp530 -sg12 -I10 -sg15 -(lp531 -(V000 -p532 -g1 -(g29 -g3 -Ntp533 -Rp534 -(dp535 -g8 -V000 -p536 -sg23 -VVP_ISA_F008_S010_I000 -p537 -sg35 -Vc.add rd, rs2\u000ax[rd] = x[rd] + x[rs2]\u000aExpands to add rd, rd, rs2. Invalid when rd=x0 or rs2=x0.\u000aArithmetic overflow is lost and ignored -p538 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p539 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p540 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp541 -sg15 -(lp542 -sg52 -(lp543 -sg13 -(dp544 -g55 -I0 -ssbtp545 -a(V001 -p546 -g1 -(g29 -g3 -Ntp547 -Rp548 -(dp549 -g8 -V001 -p550 -sg23 -VVP_ISA_F008_S010_I001 -p551 -sg35 -Vc.add rd, rs2\u000ax[rd] = x[rd] + x[rs2]\u000aExpands to add rd, rd, rs2. Invalid when rd=x0 or rs2=x0.\u000aArithmetic overflow is lost and ignored -p552 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p553 -sg39 -VInput operands:\u000a\u000a+ve,-ve and zero values of rs2 are used\u000a+ve,-ve, and zero values of rdrs1 are used\u000aAll bits of rs2 are toggled\u000aAll bits of rd before instruction execution are toggled -p554 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp555 -sg15 -(lp556 -sg52 -(lp557 -sg13 -(dp558 -g55 -I0 -ssbtp559 -a(V002 -p560 -g1 -(g29 -g3 -Ntp561 -Rp562 -(dp563 -g8 -V002 -p564 -sg23 -VVP_ISA_F008_S010_I002 -p565 -sg35 -Vc.add rd, rs2\u000ax[rd] = x[rd] + x[rs2]\u000aExpands to add rd, rd, rs2. Invalid when rd=x0 or rs2=x0.\u000aArithmetic overflow is lost and ignored -p566 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p567 -sg39 -VOutput result:\u000a\u000aAll bits of rd are toggled\u000a+ve,-ve and zero values of rd are used -p568 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp569 -sg15 -(lp570 -sg52 -(lp571 -sg13 -(dp572 -g55 -I0 -ssbtp573 -asg71 -(lp574 -sg52 -(lp575 -sg13 -(dp576 -sbtp577 -a(V011_C.AND -p578 -g1 -(g18 -g3 -Ntp579 -Rp580 -(dp581 -g22 -I3 -sg8 -g578 -sg23 -VVP_IP008_P011 -p582 -sg25 -(dp583 -sg12 -I11 -sg15 -(lp584 -(V000 -p585 -g1 -(g29 -g3 -Ntp586 -Rp587 -(dp588 -g8 -V000 -p589 -sg23 -VVP_ISA_F008_S011_I000 -p590 -sg35 -Vc.and rd', rs2'\u000ax[8+rd'] = x[8+rd'] & x[8+rs2']\u000aExpands to and rd', rd', rs2'. -p591 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p592 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p593 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp594 -sg15 -(lp595 -sg52 -(lp596 -sg13 -(dp597 -g55 -I0 -ssbtp598 -a(V001 -p599 -g1 -(g29 -g3 -Ntp600 -Rp601 -(dp602 -g8 -V001 -p603 -sg23 -VVP_ISA_F008_S011_I001 -p604 -sg35 -Vc.and rd', rs2'\u000ax[8+rd'] = x[8+rd'] & x[8+rs2']\u000aExpands to and rd', rd', rs2'. -p605 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p606 -sg39 -VInput operands:\u000a\u000aNon-zero and zero values of rs2` are used\u000aNon-zero and zero values of rd` are used\u000aAll bits of rs2` are toggled\u000aAll bits of rd` before instruction execution are toggled -p607 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp608 -sg15 -(lp609 -sg52 -(lp610 -sg13 -(dp611 -g55 -I0 -ssbtp612 -a(V002 -p613 -g1 -(g29 -g3 -Ntp614 -Rp615 -(dp616 -g8 -V002 -p617 -sg23 -VVP_ISA_F008_S011_I002 -p618 -sg35 -Vc.and rd', rs2'\u000ax[8+rd'] = x[8+rd'] & x[8+rs2']\u000aExpands to and rd', rd', rs2'. -p619 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p620 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p621 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp622 -sg15 -(lp623 -sg52 -(lp624 -sg13 -(dp625 -g55 -I0 -ssbtp626 -asg71 -(lp627 -sg52 -(lp628 -sg13 -(dp629 -sbtp630 -a(V012_C.OR -p631 -g1 -(g18 -g3 -Ntp632 -Rp633 -(dp634 -g22 -I3 -sg8 -g631 -sg23 -VVP_IP008_P012 -p635 -sg25 -(dp636 -sg12 -I12 -sg15 -(lp637 -(V000 -p638 -g1 -(g29 -g3 -Ntp639 -Rp640 -(dp641 -g8 -V000 -p642 -sg23 -VVP_ISA_F008_S012_I000 -p643 -sg35 -Vc.or rd', rs2'\u000ax[8+rd'] = x[8+rd'] | x[8+rs2']\u000aExpands to or rd', rd', rs2'. -p644 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p645 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p646 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp647 -sg15 -(lp648 -sg52 -(lp649 -sg13 -(dp650 -g55 -I0 -ssbtp651 -a(V001 -p652 -g1 -(g29 -g3 -Ntp653 -Rp654 -(dp655 -g8 -V001 -p656 -sg23 -VVP_ISA_F008_S012_I001 -p657 -sg35 -Vc.or rd', rs2'\u000ax[8+rd'] = x[8+rd'] | x[8+rs2']\u000aExpands to or rd', rd', rs2'. -p658 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p659 -sg39 -VInput operands:\u000a\u000aNon-zero and zero values of rs2` are used\u000aNon-zero and zero values of rd` are used\u000aAll bits of rs2` are toggled\u000aAll bits of rd` before instruction execution are toggled -p660 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp661 -sg15 -(lp662 -sg52 -(lp663 -sg13 -(dp664 -g55 -I0 -ssbtp665 -a(V002 -p666 -g1 -(g29 -g3 -Ntp667 -Rp668 -(dp669 -g8 -V002 -p670 -sg23 -VVP_ISA_F008_S012_I002 -p671 -sg35 -Vc.or rd', rs2'\u000ax[8+rd'] = x[8+rd'] | x[8+rs2']\u000aExpands to or rd', rd', rs2'. -p672 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p673 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p674 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp675 -sg15 -(lp676 -sg52 -(lp677 -sg13 -(dp678 -g55 -I0 -ssbtp679 -asg71 -(lp680 -sg52 -(lp681 -sg13 -(dp682 -sbtp683 -a(V013_C.XOR -p684 -g1 -(g18 -g3 -Ntp685 -Rp686 -(dp687 -g22 -I3 -sg8 -g684 -sg23 -VVP_IP008_P013 -p688 -sg25 -(dp689 -sg12 -I13 -sg15 -(lp690 -(V000 -p691 -g1 -(g29 -g3 -Ntp692 -Rp693 -(dp694 -g8 -V000 -p695 -sg23 -VVP_ISA_F008_S013_I000 -p696 -sg35 -Vc.xor rd', rs2'\u000ax[8+rd'] = x[8+rd'] ^ x[8+rs2']\u000aExpands to xor rd', rd', rs2'. -p697 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p698 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p699 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp700 -sg15 -(lp701 -sg52 -(lp702 -sg13 -(dp703 -g55 -I0 -ssbtp704 -a(V001 -p705 -g1 -(g29 -g3 -Ntp706 -Rp707 -(dp708 -g8 -V001 -p709 -sg23 -VVP_ISA_F008_S013_I001 -p710 -sg35 -Vc.xor rd', rs2'\u000ax[8+rd'] = x[8+rd'] ^ x[8+rs2']\u000aExpands to xor rd', rd', rs2'. -p711 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p712 -sg39 -VInput operands:\u000a\u000aNon-zero and zero values of rs2` are used\u000aNon-zero and zero values of rd` are used\u000aAll bits of rs2` are toggled\u000aAll bits of rd` before instruction execution are toggled -p713 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp714 -sg15 -(lp715 -sg52 -(lp716 -sg13 -(dp717 -g55 -I0 -ssbtp718 -a(V002 -p719 -g1 -(g29 -g3 -Ntp720 -Rp721 -(dp722 -g8 -V002 -p723 -sg23 -VVP_ISA_F008_S013_I002 -p724 -sg35 -Vc.xor rd', rs2'\u000ax[8+rd'] = x[8+rd'] ^ x[8+rs2']\u000aExpands to xor rd', rd', rs2'. -p725 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p726 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p727 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp728 -sg15 -(lp729 -sg52 -(lp730 -sg13 -(dp731 -g55 -I0 -ssbtp732 -asg71 -(lp733 -sg52 -(lp734 -sg13 -(dp735 -sbtp736 -a(V014_C.SUB -p737 -g1 -(g18 -g3 -Ntp738 -Rp739 -(dp740 -g22 -I3 -sg8 -g737 -sg23 -VVP_IP008_P014 -p741 -sg25 -(dp742 -sg12 -I14 -sg15 -(lp743 -(V000 -p744 -g1 -(g29 -g3 -Ntp745 -Rp746 -(dp747 -g8 -V000 -p748 -sg23 -VVP_ISA_F008_S014_I000 -p749 -sg35 -Vc.sub rd', rs2'\u000ax[8+rd'] = x[8+rd'] - x[8+rs2']\u000aExpands to sub rd', rd', rs2'. Arithmetic underflow is ignored -p750 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p751 -sg39 -VRegister operands:\u000a\u000aAll possible rd` registers are used. -p752 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp753 -sg15 -(lp754 -sg52 -(lp755 -sg13 -(dp756 -g55 -I0 -ssbtp757 -a(V001 -p758 -g1 -(g29 -g3 -Ntp759 -Rp760 -(dp761 -g8 -V001 -p762 -sg23 -VVP_ISA_F008_S014_I001 -p763 -sg35 -Vc.sub rd', rs2'\u000ax[8+rd'] = x[8+rd'] - x[8+rs2']\u000aExpands to sub rd', rd', rs2'. Arithmetic underflow is ignored -p764 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p765 -sg39 -VInput operands:\u000a\u000a+ve,-ve and zero values of rs2` are used\u000a+ve, -ve, and zero values of rd` are used\u000aAll bits of rs2` are toggled\u000aAll bits of rd` before instruction execution are toggled -p766 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp767 -sg15 -(lp768 -sg52 -(lp769 -sg13 -(dp770 -g55 -I0 -ssbtp771 -a(V002 -p772 -g1 -(g29 -g3 -Ntp773 -Rp774 -(dp775 -g8 -V002 -p776 -sg23 -VVP_ISA_F008_S014_I002 -p777 -sg35 -Vc.sub rd', rs2'\u000ax[8+rd'] = x[8+rd'] - x[8+rs2']\u000aExpands to sub rd', rd', rs2'. Arithmetic underflow is ignored -p778 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p779 -sg39 -VOutput result:\u000a\u000aAll bits of rd` are toggled -p780 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp781 -sg15 -(lp782 -sg52 -(lp783 -sg13 -(dp784 -g55 -I0 -ssbtp785 -asg71 -(lp786 -sg52 -(lp787 -sg13 -(dp788 -sbtp789 -a(V015_C.EBREAK -p790 -g1 -(g18 -g3 -Ntp791 -Rp792 -(dp793 -g22 -I1 -sg8 -g790 -sg23 -VVP_IP008_P015 -p794 -sg25 -(dp795 -sg12 -I15 -sg15 -(lp796 -(V000 -p797 -g1 -(g29 -g3 -Ntp798 -Rp799 -(dp800 -g8 -V000 -p801 -sg23 -VVP_ISA_F008_S015_I000 -p802 -sg35 -Vc.ebreak\u000aRaiseException(Breakpoint)\u000aExpands to ebreak. -p803 -sg37 -VUnprivileged ISA\u000aChapter 16.5 -p804 -sg39 -VInstruction executed -p805 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp806 -sg15 -(lp807 -sg52 -(lp808 -sg13 -(dp809 -g55 -I0 -ssbtp810 -asg71 -(lp811 -sg52 -(lp812 -sg13 -(dp813 -sbtp814 -asVrfu_list_0 -p815 -(lp816 -sg71 -(lp817 -sVvptool_gitrev -p818 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p819 -sVio_fmt_gitrev -p820 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p821 -sVconfig_gitrev -p822 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p823 -sVymlcfg_gitrev -p824 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p825 -sbtp826 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml new file mode 100644 index 000000000..21eb1d64e --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml @@ -0,0 +1,868 @@ +!Feature +next_elt_id: 16 +name: RV32C Integer Computational Instructions +id: 10 +display_order: 10 +subfeatures: !!omap +- 000_C.LI: !Subfeature + name: 000_C.LI + tag: VP_IP008_P000 + next_elt_id: 2 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S000_I000 + description: "c.li rd, imm[5:0]\nx[rd] = sext(imm)\nExpands to addi rd, x0,\ + \ imm[5:0]. Invalid when rd=x0.\nrd is calculated using signed arithmetic" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of imm[5:0] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S000_I001 + description: "c.li rd, imm[5:0]\nx[rd] = sext(imm)\nExpands to addi rd, x0,\ + \ imm[5:0]. Invalid when rd=x0.\nrd is calculated using signed arithmetic" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 001_C.LUI: !Subfeature + name: 001_C.LUI + tag: VP_IP008_P001 + next_elt_id: 2 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S001_I000 + description: "c.lui rd, nzimm[17:12]\nx[rd] = sext(nzimm[17:12] << 12)\nExpands\ + \ to lui rd, nzimm[17:12]. Invalid when rd = {x0, x2} or imm = 0.\nrd is\ + \ calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of imm[17:12] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S001_I001 + description: "c.lui rd, nzimm[17:12]\nx[rd] = sext(nzimm[17:12] << 12)\nExpands\ + \ to lui rd, nzimm[17:12]. Invalid when rd = {x0, x2} or imm = 0.\nrd is\ + \ calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd[31:12] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 002_C.ADDI: !Subfeature + name: 002_C.ADDI + tag: VP_IP008_P002 + next_elt_id: 3 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S002_I000 + description: "c.addi rd, nzimm[5:0]\nx[rd] = x[rd] + sext(nzimm[5:0])\nExpands\ + \ to addi rd, rd, nzimm[5:0].\nInvalid when rd=x0 or nzimm = 0. Arithmetic\ + \ overflow is lost and ignored.\nrd is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S002_I001 + description: "c.addi rd, nzimm[5:0]\nx[rd] = x[rd] + sext(nzimm[5:0])\nExpands\ + \ to addi rd, rd, nzimm[5:0].\nInvalid when rd=x0 or nzimm = 0. Arithmetic\ + \ overflow is lost and ignored.\nrd is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll inputs bits of rd before instruction\ + \ execution are toggled\nAll bits of nzimm are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S002_I002 + description: "c.addi rd, nzimm[5:0]\nx[rd] = x[rd] + sext(nzimm[5:0])\nExpands\ + \ to addi rd, rd, nzimm[5:0].\nInvalid when rd=x0 or nzimm = 0. Arithmetic\ + \ overflow is lost and ignored.\nrd is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 003_C.ADDI16SP: !Subfeature + name: 003_C.ADDI16SP + tag: VP_IP008_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S003_I000 + description: "c.addi16sp nzimm[9:4]\nx[2] = x[2] + sext(nzimm[9:4])\nExpands\ + \ to addi x2, x2, nzimm[9:4]. Invalid when nzimm=0.\nrd is calculated using\ + \ signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\n+ve and -ve values of nzimm are used\nAll\ + \ bits of nzimm[9:4] are toggled\nAll bits of x2 before instruction execution\ + \ are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S003_I001 + description: "c.addi16sp nzimm[9:4]\nx[2] = x[2] + sext(nzimm[9:4])\nExpands\ + \ to addi x2, x2, nzimm[9:4]. Invalid when nzimm=0.\nrd is calculated using\ + \ signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of x2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 004_C.ADDI4SPN: !Subfeature + name: 004_C.ADDI4SPN + tag: VP_IP008_P004 + next_elt_id: 3 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S004_I000 + description: "c.addi4spn rd', nzuimm[9:2]\nx[8+rd'] = x[2] + nzuimm[9:2]\n\ + Expands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\nrd is calculated\ + \ using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S004_I001 + description: "c.addi4spn rd', nzuimm[9:2]\nx[8+rd'] = x[2] + nzuimm[9:2]\n\ + Expands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\nrd is calculated\ + \ using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of nzuimm[9:2] are toggled\nAll\ + \ bits of x2 before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S004_I002 + description: "c.addi4spn rd', nzuimm[9:2]\nx[8+rd'] = x[2] + nzuimm[9:2]\n\ + Expands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\nrd is calculated\ + \ using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 005_C.SLLI: !Subfeature + name: 005_C.SLLI + tag: VP_IP008_P005 + next_elt_id: 3 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S005_I000 + description: "c.slli rd, uimm[5:0]\nx[rd] = x[rd] << uimm[5:0]\nExpands to\ + \ slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S005_I001 + description: "c.slli rd, uimm[5:0]\nx[rd] = x[rd] << uimm[5:0]\nExpands to\ + \ slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll shift amounts from [0:31] are used\n\ + All bits of rd before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S005_I002 + description: "c.slli rd, uimm[5:0]\nx[rd] = x[rd] << uimm[5:0]\nExpands to\ + \ slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 006_C.SRLI: !Subfeature + name: 006_C.SRLI + tag: VP_IP008_P006 + next_elt_id: 3 + display_order: 6 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S006_I000 + description: "c.srli rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >>u uimm[5:0]\nExpands\ + \ to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0," + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S006_I001 + description: "c.srli rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >>u uimm[5:0]\nExpands\ + \ to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0," + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll shift amounts from [0:31] are used\n\ + All bits of rd before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S006_I002 + description: "c.srli rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >>u uimm[5:0]\nExpands\ + \ to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0," + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 007_C.SRAI: !Subfeature + name: 007_C.SRAI + tag: VP_IP008_P007 + next_elt_id: 3 + display_order: 7 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S007_I000 + description: "c.srai rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >> uimm[5:0]\nExpands\ + \ to srai rd', rd', uimm[5:0]." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S007_I001 + description: "c.srai rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >> uimm[5:0]\nExpands\ + \ to srai rd', rd', uimm[5:0]." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll shift amounts from [0:31] are used\n\ + +ve, -ve and zero values of rd` are used\nAll bits of rd` before instruction\ + \ execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S007_I002 + description: "c.srai rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >> uimm[5:0]\nExpands\ + \ to srai rd', rd', uimm[5:0]." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 008_C.ANDI: !Subfeature + name: 008_C.ANDI + tag: VP_IP008_P008 + next_elt_id: 3 + display_order: 8 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S008_I000 + description: "c.andi rd', imm[5:0]\nx[8+rd'] = x[8+rd'] & sext(imm[5:0])\n\ + Expands to andi rd', rd', imm[5:0].\nimm treated as signed number" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S008_I001 + description: "c.andi rd', imm[5:0]\nx[8+rd'] = x[8+rd'] & sext(imm[5:0])\n\ + Expands to andi rd', rd', imm[5:0].\nimm treated as signed number" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll shift amounts from [0:31] are used\n\ + +ve, -ve and zero values of imm are used\nAll bits of rd` before instruction\ + \ execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S008_I002 + description: "c.andi rd', imm[5:0]\nx[8+rd'] = x[8+rd'] & sext(imm[5:0])\n\ + Expands to andi rd', rd', imm[5:0].\nimm treated as signed number" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 009_C.MV: !Subfeature + name: 009_C.MV + tag: VP_IP008_P009 + next_elt_id: 3 + display_order: 9 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S009_I000 + description: "c.mv rd, rs2\nx[rd] = x[rs2]\nExpands to add rd, x0, rs2\nInvalid\ + \ when rs2=x0 or rd=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used.\n\ + All possible register combinations where rs2 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S009_I001 + description: "c.mv rd, rs2\nx[rd] = x[rs2]\nExpands to add rd, x0, rs2\nInvalid\ + \ when rs2=x0 or rd=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs2 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S009_I002 + description: "c.mv rd, rs2\nx[rd] = x[rs2]\nExpands to add rd, x0, rs2\nInvalid\ + \ when rs2=x0 or rd=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 010_C.ADD: !Subfeature + name: 010_C.ADD + tag: VP_IP008_P010 + next_elt_id: 3 + display_order: 10 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S010_I000 + description: "c.add rd, rs2\nx[rd] = x[rd] + x[rs2]\nExpands to add rd, rd,\ + \ rs2. Invalid when rd=x0 or rs2=x0.\nArithmetic overflow is lost and ignored" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S010_I001 + description: "c.add rd, rs2\nx[rd] = x[rd] + x[rs2]\nExpands to add rd, rd,\ + \ rs2. Invalid when rd=x0 or rs2=x0.\nArithmetic overflow is lost and ignored" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\n+ve,-ve and zero values of rs2 are used\n\ + +ve,-ve, and zero values of rdrs1 are used\nAll bits of rs2 are toggled\n\ + All bits of rd before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S010_I002 + description: "c.add rd, rs2\nx[rd] = x[rd] + x[rs2]\nExpands to add rd, rd,\ + \ rs2. Invalid when rd=x0 or rs2=x0.\nArithmetic overflow is lost and ignored" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd are toggled\n+ve,-ve and zero\ + \ values of rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 011_C.AND: !Subfeature + name: 011_C.AND + tag: VP_IP008_P011 + next_elt_id: 3 + display_order: 11 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S011_I000 + description: "c.and rd', rs2'\nx[8+rd'] = x[8+rd'] & x[8+rs2']\nExpands to\ + \ and rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S011_I001 + description: "c.and rd', rs2'\nx[8+rd'] = x[8+rd'] & x[8+rs2']\nExpands to\ + \ and rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nNon-zero and zero values of rs2` are used\n\ + Non-zero and zero values of rd` are used\nAll bits of rs2` are toggled\n\ + All bits of rd` before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S011_I002 + description: "c.and rd', rs2'\nx[8+rd'] = x[8+rd'] & x[8+rs2']\nExpands to\ + \ and rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 012_C.OR: !Subfeature + name: 012_C.OR + tag: VP_IP008_P012 + next_elt_id: 3 + display_order: 12 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S012_I000 + description: "c.or rd', rs2'\nx[8+rd'] = x[8+rd'] | x[8+rs2']\nExpands to\ + \ or rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S012_I001 + description: "c.or rd', rs2'\nx[8+rd'] = x[8+rd'] | x[8+rs2']\nExpands to\ + \ or rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nNon-zero and zero values of rs2` are used\n\ + Non-zero and zero values of rd` are used\nAll bits of rs2` are toggled\n\ + All bits of rd` before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S012_I002 + description: "c.or rd', rs2'\nx[8+rd'] = x[8+rd'] | x[8+rs2']\nExpands to\ + \ or rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 013_C.XOR: !Subfeature + name: 013_C.XOR + tag: VP_IP008_P013 + next_elt_id: 3 + display_order: 13 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S013_I000 + description: "c.xor rd', rs2'\nx[8+rd'] = x[8+rd'] ^ x[8+rs2']\nExpands to\ + \ xor rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S013_I001 + description: "c.xor rd', rs2'\nx[8+rd'] = x[8+rd'] ^ x[8+rs2']\nExpands to\ + \ xor rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nNon-zero and zero values of rs2` are used\n\ + Non-zero and zero values of rd` are used\nAll bits of rs2` are toggled\n\ + All bits of rd` before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S013_I002 + description: "c.xor rd', rs2'\nx[8+rd'] = x[8+rd'] ^ x[8+rs2']\nExpands to\ + \ xor rd', rd', rs2'." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 014_C.SUB: !Subfeature + name: 014_C.SUB + tag: VP_IP008_P014 + next_elt_id: 3 + display_order: 14 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S014_I000 + description: "c.sub rd', rs2'\nx[8+rd'] = x[8+rd'] - x[8+rs2']\nExpands to\ + \ sub rd', rd', rs2'. Arithmetic underflow is ignored" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F008_S014_I001 + description: "c.sub rd', rs2'\nx[8+rd'] = x[8+rd'] - x[8+rs2']\nExpands to\ + \ sub rd', rd', rs2'. Arithmetic underflow is ignored" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\n+ve,-ve and zero values of rs2` are used\n\ + +ve, -ve, and zero values of rd` are used\nAll bits of rs2` are toggled\n\ + All bits of rd` before instruction execution are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F008_S014_I002 + description: "c.sub rd', rs2'\nx[8+rd'] = x[8+rd'] - x[8+rs2']\nExpands to\ + \ sub rd', rd', rs2'. Arithmetic underflow is ignored" + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of rd` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 015_C.EBREAK: !Subfeature + name: 015_C.EBREAK + tag: VP_IP008_P015 + next_elt_id: 1 + display_order: 15 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F008_S015_I000 + description: "c.ebreak\nRaiseException(Breakpoint)\nExpands to ebreak." + reqt_doc: "Unprivileged ISA\nChapter 16.5" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Instruction executed + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.pck deleted file mode 100644 index e8ad3e411..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.pck +++ /dev/null @@ -1,920 +0,0 @@ -(VRV32C Control Transfer Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I6 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I11 -sVwid_order -p12 -I11 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_C.J -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP010_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F010_S000_I000 -p34 -sVdescription -p35 -Vc.j imm[11:1]\u000apc += sext(imm)\u000apc is calculated using signed arithmetic\u000aExpands to jal x0, imm[11:1]. -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 16.4 -p38 -sVverif_goals -p39 -VInput operands:\u000a\u000auimm value is non-zero and zero\u000aAll bits of uimm are toggled -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -asVrfu_list_1 -p57 -(lp58 -sg52 -(lp59 -sg13 -(dp60 -sbtp61 -a(V001_C.JAL -p62 -g1 -(g18 -g3 -Ntp63 -Rp64 -(dp65 -g22 -I2 -sg8 -g62 -sg23 -VVP_IP010_P001 -p66 -sg25 -(dp67 -sg12 -I1 -sg15 -(lp68 -(V000 -p69 -g1 -(g29 -g3 -Ntp70 -Rp71 -(dp72 -g8 -V000 -p73 -sg23 -VVP_ISA_F010_S001_I000 -p74 -sg35 -Vc.jal imm[11:1]\u000ax[1] = pc+2; pc += sext(imm)\u000apc is calculated using signed arithmetic. -p75 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p76 -sg39 -VInput operands:\u000a\u000auimm value is non-zero and zero\u000aAll bits of uimm are toggled -p77 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp78 -sg15 -(lp79 -sg52 -(lp80 -sg13 -(dp81 -g55 -I0 -ssbtp82 -a(V001 -p83 -g1 -(g29 -g3 -Ntp84 -Rp85 -(dp86 -g8 -V001 -p87 -sg23 -VVP_ISA_F010_S001_I001 -p88 -sg35 -Vc.jal imm[11:1]\u000ax[1] = pc+2; pc += sext(imm)\u000apc is calculated using signed arithmetic. -p89 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p90 -sg39 -VOutput result:\u000a\u000aAll bits of x1 are toggled -p91 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp92 -sg15 -(lp93 -sg52 -(lp94 -sg13 -(dp95 -g55 -I0 -ssbtp96 -asg57 -(lp97 -sg52 -(lp98 -sg13 -(dp99 -sbtp100 -a(V002_C.JR -p101 -g1 -(g18 -g3 -Ntp102 -Rp103 -(dp104 -g22 -I2 -sg8 -g101 -sg23 -VVP_IP010_P002 -p105 -sg25 -(dp106 -sg12 -I2 -sg15 -(lp107 -(V000 -p108 -g1 -(g29 -g3 -Ntp109 -Rp110 -(dp111 -g8 -V000 -p112 -sg23 -VVP_ISA_F010_S002_I000 -p113 -sg35 -Vc.jr rs1\u000apc = x[rs1]\u000aExpands to jalr x0, 0(rs1). \u000aInvalid when rs1=x0. -p114 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p115 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used. -p116 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp117 -sg15 -(lp118 -sg52 -(lp119 -sg13 -(dp120 -g55 -I0 -ssbtp121 -a(V001 -p122 -g1 -(g29 -g3 -Ntp123 -Rp124 -(dp125 -g8 -V001 -p126 -sg23 -VVP_ISA_F010_S002_I001 -p127 -sg35 -Vc.jr rs1\u000apc = x[rs1]\u000aExpands to jalr x0, 0(rs1). \u000aInvalid when rs1=x0. -p128 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p129 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled -p130 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp131 -sg15 -(lp132 -sg52 -(lp133 -sg13 -(dp134 -g55 -I0 -ssbtp135 -asg57 -(lp136 -sg52 -(lp137 -sg13 -(dp138 -sbtp139 -a(V003_C.JALR -p140 -g1 -(g18 -g3 -Ntp141 -Rp142 -(dp143 -g22 -I3 -sg8 -g140 -sg23 -VVP_IP010_P003 -p144 -sg25 -(dp145 -sg12 -I3 -sg15 -(lp146 -(V000 -p147 -g1 -(g29 -g3 -Ntp148 -Rp149 -(dp150 -g8 -V000 -p151 -sg23 -VVP_ISA_F010_S003_I000 -p152 -sg35 -Vc.jalr rs1\u000at = pc + 2; pc = x[rs1]; x[1] = t\u000aExpands to jalr x1, 0(rs1). \u000aInvalid when rs1=x0. -p153 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p154 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used. -p155 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp156 -sg15 -(lp157 -sg52 -(lp158 -sg13 -(dp159 -g55 -I0 -ssbtp160 -a(V001 -p161 -g1 -(g29 -g3 -Ntp162 -Rp163 -(dp164 -g8 -V001 -p165 -sg23 -VVP_ISA_F010_S003_I001 -p166 -sg35 -Vc.jalr rs1\u000at = pc + 2; pc = x[rs1]; x[1] = t\u000aExpands to jalr x1, 0(rs1). \u000aInvalid when rs1=x0. -p167 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p168 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled -p169 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp170 -sg15 -(lp171 -sg52 -(lp172 -sg13 -(dp173 -g55 -I0 -ssbtp174 -a(V002 -p175 -g1 -(g29 -g3 -Ntp176 -Rp177 -(dp178 -g8 -V002 -p179 -sg23 -VVP_ISA_F010_S003_I002 -p180 -sg35 -Vc.jalr rs1\u000at = pc + 2; pc = x[rs1]; x[1] = t\u000aExpands to jalr x1, 0(rs1). \u000aInvalid when rs1=x0. -p181 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p182 -sg39 -VOutput result:\u000a\u000aAll bits of x1 are toggled -p183 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp184 -sg15 -(lp185 -sg52 -(lp186 -sg13 -(dp187 -g55 -I0 -ssbtp188 -asg57 -(lp189 -sg52 -(lp190 -sg13 -(dp191 -sbtp192 -a(V004_C.BEQZ -p193 -g1 -(g18 -g3 -Ntp194 -Rp195 -(dp196 -g22 -I3 -sg8 -g193 -sg23 -VVP_IP010_P004 -p197 -sg25 -(dp198 -sg12 -I4 -sg15 -(lp199 -(V000 -p200 -g1 -(g29 -g3 -Ntp201 -Rp202 -(dp203 -g8 -V000 -p204 -sg23 -VVP_ISA_F010_S004_I000 -p205 -sg35 -Vc.beqz rs1', imm[8:1]\u000aif (x[8+rs1'] == 0) pc += sext(imm)\u000aExpands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic. -p206 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p207 -sg39 -VRegister operands:\u000a\u000aAll possible rs1` registers are used. -p208 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp209 -sg15 -(lp210 -sg52 -(lp211 -sg13 -(dp212 -g55 -I0 -ssbtp213 -a(V001 -p214 -g1 -(g29 -g3 -Ntp215 -Rp216 -(dp217 -g8 -V001 -p218 -sg23 -VVP_ISA_F010_S004_I001 -p219 -sg35 -Vc.beqz rs1', imm[8:1]\u000aif (x[8+rs1'] == 0) pc += sext(imm)\u000aExpands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic. -p220 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p221 -sg39 -VInput operands:\u000a\u000aAll bits of rs1` are toggled -p222 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp223 -sg15 -(lp224 -sg52 -(lp225 -sg13 -(dp226 -g55 -I0 -ssbtp227 -a(V002 -p228 -g1 -(g29 -g3 -Ntp229 -Rp230 -(dp231 -g8 -V002 -p232 -sg23 -VVP_ISA_F010_S004_I002 -p233 -sg35 -Vc.beqz rs1', imm[8:1]\u000aif (x[8+rs1'] == 0) pc += sext(imm)\u000aExpands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic. -p234 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p235 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p236 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp237 -sg15 -(lp238 -sg52 -(lp239 -sg13 -(dp240 -g55 -I0 -ssbtp241 -asg57 -(lp242 -sg52 -(lp243 -sg13 -(dp244 -sbtp245 -a(V005_C.BNEZ -p246 -g1 -(g18 -g3 -Ntp247 -Rp248 -(dp249 -g22 -I3 -sg8 -g246 -sg23 -VVP_IP010_P005 -p250 -sg25 -(dp251 -sg12 -I5 -sg15 -(lp252 -(V000 -p253 -g1 -(g29 -g3 -Ntp254 -Rp255 -(dp256 -g8 -V000 -p257 -sg23 -VVP_ISA_F010_S005_I000 -p258 -sg35 -Vc.bnez rs1', imm[8:1]\u000aif (x[8+rs1'] \u2260 0) pc += sext(imm)\u000aExpands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic. -p259 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p260 -sg39 -VRegister operands:\u000a\u000aAll possible rs1` registers are used. -p261 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp262 -sg15 -(lp263 -sg52 -(lp264 -sg13 -(dp265 -g55 -I0 -ssbtp266 -a(V001 -p267 -g1 -(g29 -g3 -Ntp268 -Rp269 -(dp270 -g8 -V001 -p271 -sg23 -VVP_ISA_F010_S005_I001 -p272 -sg35 -Vc.bnez rs1', imm[8:1]\u000aif (x[8+rs1'] \u2260 0) pc += sext(imm)\u000aExpands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic. -p273 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p274 -sg39 -VInput operands:\u000a\u000aAll bits of rs1 are toggled -p275 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp276 -sg15 -(lp277 -sg52 -(lp278 -sg13 -(dp279 -g55 -I0 -ssbtp280 -a(V002 -p281 -g1 -(g29 -g3 -Ntp282 -Rp283 -(dp284 -g8 -V002 -p285 -sg23 -VVP_ISA_F010_S005_I002 -p286 -sg35 -Vc.bnez rs1', imm[8:1]\u000aif (x[8+rs1'] \u2260 0) pc += sext(imm)\u000aExpands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic. -p287 -sg37 -VUnprivileged ISA\u000aChapter 16.4 -p288 -sg39 -VOutput result:\u000a\u000aBranch taken or not-taken -p289 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp290 -sg15 -(lp291 -sg52 -(lp292 -sg13 -(dp293 -g55 -I0 -ssbtp294 -asg57 -(lp295 -sg52 -(lp296 -sg13 -(dp297 -sbtp298 -asVrfu_list_0 -p299 -(lp300 -sg57 -(lp301 -sVvptool_gitrev -p302 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p303 -sVio_fmt_gitrev -p304 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p305 -sVconfig_gitrev -p306 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p307 -sVymlcfg_gitrev -p308 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p309 -sbtp310 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml new file mode 100644 index 000000000..c95e04332 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml @@ -0,0 +1,286 @@ +!Feature +next_elt_id: 6 +name: RV32C Control Transfer Instructions +id: 11 +display_order: 11 +subfeatures: !!omap +- 000_C.J: !Subfeature + name: 000_C.J + tag: VP_IP010_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F010_S000_I000 + description: "c.j imm[11:1]\npc += sext(imm)\npc is calculated using signed\ + \ arithmetic\nExpands to jal x0, imm[11:1]." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nuimm value is non-zero and zero\nAll bits\ + \ of uimm are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 001_C.JAL: !Subfeature + name: 001_C.JAL + tag: VP_IP010_P001 + next_elt_id: 2 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F010_S001_I000 + description: "c.jal imm[11:1]\nx[1] = pc+2; pc += sext(imm)\npc is calculated\ + \ using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nuimm value is non-zero and zero\nAll bits\ + \ of uimm are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F010_S001_I001 + description: "c.jal imm[11:1]\nx[1] = pc+2; pc += sext(imm)\npc is calculated\ + \ using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of x1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 002_C.JR: !Subfeature + name: 002_C.JR + tag: VP_IP010_P002 + next_elt_id: 2 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F010_S002_I000 + description: "c.jr rs1\npc = x[rs1]\nExpands to jalr x0, 0(rs1). \nInvalid\ + \ when rs1=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F010_S002_I001 + description: "c.jr rs1\npc = x[rs1]\nExpands to jalr x0, 0(rs1). \nInvalid\ + \ when rs1=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 003_C.JALR: !Subfeature + name: 003_C.JALR + tag: VP_IP010_P003 + next_elt_id: 3 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F010_S003_I000 + description: "c.jalr rs1\nt = pc + 2; pc = x[rs1]; x[1] = t\nExpands to jalr\ + \ x1, 0(rs1). \nInvalid when rs1=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F010_S003_I001 + description: "c.jalr rs1\nt = pc + 2; pc = x[rs1]; x[1] = t\nExpands to jalr\ + \ x1, 0(rs1). \nInvalid when rs1=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F010_S003_I002 + description: "c.jalr rs1\nt = pc + 2; pc = x[rs1]; x[1] = t\nExpands to jalr\ + \ x1, 0(rs1). \nInvalid when rs1=x0." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nAll bits of x1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 004_C.BEQZ: !Subfeature + name: 004_C.BEQZ + tag: VP_IP010_P004 + next_elt_id: 3 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F010_S004_I000 + description: "c.beqz rs1', imm[8:1]\nif (x[8+rs1'] == 0) pc += sext(imm)\n\ + Expands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F010_S004_I001 + description: "c.beqz rs1', imm[8:1]\nif (x[8+rs1'] == 0) pc += sext(imm)\n\ + Expands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F010_S004_I002 + description: "c.beqz rs1', imm[8:1]\nif (x[8+rs1'] == 0) pc += sext(imm)\n\ + Expands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 005_C.BNEZ: !Subfeature + name: 005_C.BNEZ + tag: VP_IP010_P005 + next_elt_id: 3 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F010_S005_I000 + description: "c.bnez rs1', imm[8:1]\nif (x[8+rs1'] ≠ 0) pc += sext(imm)\n\ + Expands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1` registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F010_S005_I001 + description: "c.bnez rs1', imm[8:1]\nif (x[8+rs1'] ≠ 0) pc += sext(imm)\n\ + Expands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nAll bits of rs1 are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F010_S005_I002 + description: "c.bnez rs1', imm[8:1]\nif (x[8+rs1'] ≠ 0) pc += sext(imm)\n\ + Expands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." + reqt_doc: "Unprivileged ISA\nChapter 16.4" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nBranch taken or not-taken" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.pck deleted file mode 100644 index 73c3f301f..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.pck +++ /dev/null @@ -1,672 +0,0 @@ -(VRV32C Load and Store Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I4 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I12 -sVwid_order -p12 -I12 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_C.LWSP -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I3 -sg8 -g17 -sVtag -p23 -VVP_IP009_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F009_S000_I000 -p34 -sVdescription -p35 -Vc.lwsp rd, uimm(x2)\u000ax[rd] = sext(M[x[2] + uimm][0:31])\u000aExpands to lw rd, uimm[7:2](x2). \u000aInvalid when rd=x0.\u000auimm treated as unsigned number -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 16.3 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rd registers are used. -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_ISA_F009_S000_I001 -p62 -sg35 -Vc.lwsp rd, uimm(x2)\u000ax[rd] = sext(M[x[2] + uimm][0:31])\u000aExpands to lw rd, uimm[7:2](x2). \u000aInvalid when rd=x0.\u000auimm treated as unsigned number -p63 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p64 -sg39 -VInput operands:\u000a\u000auimm value is non-zero and zero\u000aAll bits of uimm are toggled -p65 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -a(V002 -p71 -g1 -(g29 -g3 -Ntp72 -Rp73 -(dp74 -g8 -V002 -p75 -sg23 -VVP_ISA_F009_S000_I002 -p76 -sg35 -Vc.lwsp rd, uimm(x2)\u000ax[rd] = sext(M[x[2] + uimm][0:31])\u000aExpands to lw rd, uimm[7:2](x2). \u000aInvalid when rd=x0.\u000auimm treated as unsigned number -p77 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p78 -sg39 -VOutput result:\u000a\u000ard value is non-zero and zero\u000aAll bits of rd are toggled -p79 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp80 -sg15 -(lp81 -sg52 -(lp82 -sg13 -(dp83 -g55 -I0 -ssbtp84 -asVrfu_list_1 -p85 -(lp86 -sg52 -(lp87 -sg13 -(dp88 -sbtp89 -a(V001_C.SWSP -p90 -g1 -(g18 -g3 -Ntp91 -Rp92 -(dp93 -g22 -I2 -sg8 -g90 -sg23 -VVP_IP009_P001 -p94 -sg25 -(dp95 -sg12 -I1 -sg15 -(lp96 -(V000 -p97 -g1 -(g29 -g3 -Ntp98 -Rp99 -(dp100 -g8 -V000 -p101 -sg23 -VVP_ISA_F009_S001_I000 -p102 -sg35 -Vc.swsp rs2, uimm(x2)\u000aM[x[2] + uimm][0:31] = x[rs2]\u000aExpands to sw rs2, uimm[7:2](x2).\u000auimm treated as unsigned number -p103 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p104 -sg39 -VRegister operands:\u000a\u000aAll possible rs2 registers are used. -p105 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp106 -sg15 -(lp107 -sg52 -(lp108 -sg13 -(dp109 -g55 -I0 -ssbtp110 -a(V001 -p111 -g1 -(g29 -g3 -Ntp112 -Rp113 -(dp114 -g8 -V001 -p115 -sg23 -VVP_ISA_F009_S001_I001 -p116 -sg35 -Vc.swsp rs2, uimm(x2)\u000aM[x[2] + uimm][0:31] = x[rs2]\u000aExpands to sw rs2, uimm[7:2](x2).\u000auimm treated as unsigned number -p117 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p118 -sg39 -VInput operands:\u000a\u000auimm value is non-zero and zero\u000aAll bits of uimm are toggled -p119 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp120 -sg15 -(lp121 -sg52 -(lp122 -sg13 -(dp123 -g55 -I0 -ssbtp124 -asg85 -(lp125 -sg52 -(lp126 -sg13 -(dp127 -sbtp128 -a(V002_C.LW -p129 -g1 -(g18 -g3 -Ntp130 -Rp131 -(dp132 -g22 -I3 -sg8 -g129 -sg23 -VVP_IP009_P002 -p133 -sg25 -(dp134 -sg12 -I2 -sg15 -(lp135 -(V000 -p136 -g1 -(g29 -g3 -Ntp137 -Rp138 -(dp139 -g8 -V000 -p140 -sg23 -VVP_ISA_F009_S002_I000 -p141 -sg35 -Vc.lw rd', uimm(rs1')\u000ax[rd] = sext(M[x[rs1] + uimm][0:31]), where rd=8+rd' and rs1=8+rs1'\u000aExpands to lw rd', uimm[6:2](rs1') -p142 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p143 -sg39 -VRegister operands:\u000a\u000aAll possible rs1` registers are used.\u000aAll possible rd` registers are used.\u000aAll possible register combinations where rs1` == rd` are used -p144 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp145 -sg15 -(lp146 -sg52 -(lp147 -sg13 -(dp148 -g55 -I0 -ssbtp149 -a(V001 -p150 -g1 -(g29 -g3 -Ntp151 -Rp152 -(dp153 -g8 -V001 -p154 -sg23 -VVP_ISA_F009_S002_I001 -p155 -sg35 -Vc.lw rd', uimm(rs1')\u000ax[rd] = sext(M[x[rs1] + uimm][0:31]), where rd=8+rd' and rs1=8+rs1'\u000aExpands to lw rd', uimm[6:2](rs1') -p156 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p157 -sg39 -VInput operands:\u000a\u000auimm value is non-zero and zero\u000aAll bits of uimm are toggled\u000aAll bits of rs1` are toggled -p158 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp159 -sg15 -(lp160 -sg52 -(lp161 -sg13 -(dp162 -g55 -I0 -ssbtp163 -a(V002 -p164 -g1 -(g29 -g3 -Ntp165 -Rp166 -(dp167 -g8 -V002 -p168 -sg23 -VVP_ISA_F009_S002_I002 -p169 -sg35 -Vc.lw rd', uimm(rs1')\u000ax[rd] = sext(M[x[rs1] + uimm][0:31]), where rd=8+rd' and rs1=8+rs1'\u000aExpands to lw rd', uimm[6:2](rs1') -p170 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p171 -sg39 -VOutput result:\u000a\u000ard` value is non-zero and zero\u000aAll bits of rd are toggled -p172 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp173 -sg15 -(lp174 -sg52 -(lp175 -sg13 -(dp176 -g55 -I0 -ssbtp177 -asg85 -(lp178 -sg52 -(lp179 -sg13 -(dp180 -sbtp181 -a(V003_C.SW -p182 -g1 -(g18 -g3 -Ntp183 -Rp184 -(dp185 -g22 -I2 -sg8 -g182 -sg23 -VVP_IP009_P003 -p186 -sg25 -(dp187 -sg12 -I3 -sg15 -(lp188 -(V000 -p189 -g1 -(g29 -g3 -Ntp190 -Rp191 -(dp192 -g8 -V000 -p193 -sg23 -VVP_ISA_F009_S003_I000 -p194 -sg35 -Vc.sw rs2', uimm(rs1')\u000aM[x[rs1] + uimm][0:31] = x[rs2], where rs2=8+rs2' and rs1=8+rs1'\u000aExpands to sw rs2', uimm[6:2](rs1'). -p195 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p196 -sg39 -VRegister operands:\u000a\u000aAll possible rs1` registers are used.\u000aAll possible rd` registers are used.\u000aAll possible register combinations where rs1` == rd` are used -p197 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp198 -sg15 -(lp199 -sg52 -(lp200 -sg13 -(dp201 -g55 -I0 -ssbtp202 -a(V001 -p203 -g1 -(g29 -g3 -Ntp204 -Rp205 -(dp206 -g8 -V001 -p207 -sg23 -VVP_ISA_F009_S003_I001 -p208 -sg35 -Vc.sw rs2', uimm(rs1')\u000aM[x[rs1] + uimm][0:31] = x[rs2], where rs2=8+rs2' and rs1=8+rs1'\u000aExpands to sw rs2', uimm[6:2](rs1'). -p209 -sg37 -VUnprivileged ISA\u000aChapter 16.3 -p210 -sg39 -VInput operands:\u000a\u000auimm value is non-zero and zero\u000aAll bits of uimm are toggled\u000aAll bits of rs1` are toggled\u000aAll bits of rs2` are toggled -p211 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp212 -sg15 -(lp213 -sg52 -(lp214 -sg13 -(dp215 -g55 -I0 -ssbtp216 -asg85 -(lp217 -sg52 -(lp218 -sg13 -(dp219 -sbtp220 -asVrfu_list_0 -p221 -(lp222 -sg85 -(lp223 -sVvptool_gitrev -p224 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p225 -sVio_fmt_gitrev -p226 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p227 -sVconfig_gitrev -p228 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p229 -sVymlcfg_gitrev -p230 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p231 -sbtp232 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml new file mode 100644 index 000000000..7fe21ee0d --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml @@ -0,0 +1,218 @@ +!Feature +next_elt_id: 4 +name: RV32C Load and Store Instructions +id: 12 +display_order: 12 +subfeatures: !!omap +- 000_C.LWSP: !Subfeature + name: 000_C.LWSP + tag: VP_IP009_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S000_I000 + description: "c.lwsp rd, uimm(x2)\nx[rd] = sext(M[x[2] + uimm][0:31])\nExpands\ + \ to lw rd, uimm[7:2](x2). \nInvalid when rd=x0.\nuimm treated as unsigned\ + \ number" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S000_I001 + description: "c.lwsp rd, uimm(x2)\nx[rd] = sext(M[x[2] + uimm][0:31])\nExpands\ + \ to lw rd, uimm[7:2](x2). \nInvalid when rd=x0.\nuimm treated as unsigned\ + \ number" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nuimm value is non-zero and zero\nAll bits\ + \ of uimm are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S000_I002 + description: "c.lwsp rd, uimm(x2)\nx[rd] = sext(M[x[2] + uimm][0:31])\nExpands\ + \ to lw rd, uimm[7:2](x2). \nInvalid when rd=x0.\nuimm treated as unsigned\ + \ number" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd value is non-zero and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 001_C.SWSP: !Subfeature + name: 001_C.SWSP + tag: VP_IP009_P001 + next_elt_id: 2 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S001_I000 + description: "c.swsp rs2, uimm(x2)\nM[x[2] + uimm][0:31] = x[rs2]\nExpands\ + \ to sw rs2, uimm[7:2](x2).\nuimm treated as unsigned number" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs2 registers are used." + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S001_I001 + description: "c.swsp rs2, uimm(x2)\nM[x[2] + uimm][0:31] = x[rs2]\nExpands\ + \ to sw rs2, uimm[7:2](x2).\nuimm treated as unsigned number" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nuimm value is non-zero and zero\nAll bits\ + \ of uimm are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 002_C.LW: !Subfeature + name: 002_C.LW + tag: VP_IP009_P002 + next_elt_id: 3 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S002_I000 + description: "c.lw rd', uimm(rs1')\nx[rd] = sext(M[x[rs1] + uimm][0:31]),\ + \ where rd=8+rd' and rs1=8+rs1'\nExpands to lw rd', uimm[6:2](rs1')" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1` registers are used.\n\ + All possible rd` registers are used.\nAll possible register combinations\ + \ where rs1` == rd` are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S002_I001 + description: "c.lw rd', uimm(rs1')\nx[rd] = sext(M[x[rs1] + uimm][0:31]),\ + \ where rd=8+rd' and rs1=8+rs1'\nExpands to lw rd', uimm[6:2](rs1')" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nuimm value is non-zero and zero\nAll bits\ + \ of uimm are toggled\nAll bits of rs1` are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_ISA_F009_S002_I002 + description: "c.lw rd', uimm(rs1')\nx[rd] = sext(M[x[rs1] + uimm][0:31]),\ + \ where rd=8+rd' and rs1=8+rs1'\nExpands to lw rd', uimm[6:2](rs1')" + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Output result:\n\nrd` value is non-zero and zero\nAll bits of\ + \ rd are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 003_C.SW: !Subfeature + name: 003_C.SW + tag: VP_IP009_P003 + next_elt_id: 2 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F009_S003_I000 + description: "c.sw rs2', uimm(rs1')\nM[x[rs1] + uimm][0:31] = x[rs2], where\ + \ rs2=8+rs2' and rs1=8+rs1'\nExpands to sw rs2', uimm[6:2](rs1')." + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1` registers are used.\n\ + All possible rd` registers are used.\nAll possible register combinations\ + \ where rs1` == rd` are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F009_S003_I001 + description: "c.sw rs2', uimm(rs1')\nM[x[rs1] + uimm][0:31] = x[rs2], where\ + \ rs2=8+rs2' and rs1=8+rs1'\nExpands to sw rs2', uimm[6:2](rs1')." + reqt_doc: "Unprivileged ISA\nChapter 16.3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operands:\n\nuimm value is non-zero and zero\nAll bits\ + \ of uimm are toggled\nAll bits of rs1` are toggled\nAll bits of rs2` are\ + \ toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.pck deleted file mode 100644 index acac41764..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.pck +++ /dev/null @@ -1,824 +0,0 @@ -(VRV32Zicsr Control and Status Register (CSR) Instructions -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I6 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I13 -sVwid_order -p12 -I13 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_CSRRW -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I2 -sg8 -g17 -sVtag -p23 -VVP_IP007_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F007_S000_I000 -p34 -sVdescription -p35 -Vcsrrw rd, rs1, csr\u000ard = Zext([csr]); csr = [rs1] -p36 -sVpurpose -p37 -VISA Chapter 9 -p38 -sVverif_goals -p39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used\u000aAll possible rd registers are used\u000aAll supported CSRs are used\u000aAll possible register combinations where rs1 == rd are used -p40 -sVcoverage_loc -p41 -V -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -g42 -sVstatus -p48 -g42 -sVsimu_target_list -p49 -(lp50 -sg15 -(lp51 -sVrfu_list_2 -p52 -(lp53 -sg13 -(dp54 -Vlock_status -p55 -I0 -ssbtp56 -a(V001 -p57 -g1 -(g29 -g3 -Ntp58 -Rp59 -(dp60 -g8 -V001 -p61 -sg23 -VVP_ISA_F007_S000_I001 -p62 -sg35 -Vcsrrw rd, rs1, csr\u000ard = Zext([csr]); csr = [rs1] -p63 -sg37 -VISA Chapter 9 -p64 -sg39 -VInput operand:\u000a\u000aNon-zero and zero rs1 operands are used (if rs1 != x0) -p65 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp66 -sg15 -(lp67 -sg52 -(lp68 -sg13 -(dp69 -g55 -I0 -ssbtp70 -asVrfu_list_1 -p71 -(lp72 -sg52 -(lp73 -sg13 -(dp74 -sbtp75 -a(V001_CSRRS -p76 -g1 -(g18 -g3 -Ntp77 -Rp78 -(dp79 -g22 -I2 -sg8 -g76 -sg23 -VVP_IP007_P001 -p80 -sg25 -(dp81 -sg12 -I1 -sg15 -(lp82 -(V000 -p83 -g1 -(g29 -g3 -Ntp84 -Rp85 -(dp86 -g8 -V000 -p87 -sg23 -VVP_ISA_F007_S001_I000 -p88 -sg35 -Vcsrrs rd, rs1, csr\u000ard = Zext([csr]); csr = [rs1] | csr\u000aNote that not all bits of csr will be writable. -p89 -sg37 -VISA Chapter 9 -p90 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used\u000aAll possible rd registers are used\u000aAll supported CSRs are used\u000aAll possible register combinations where rs1 == rd are used -p91 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp92 -sg15 -(lp93 -sg52 -(lp94 -sg13 -(dp95 -g55 -I0 -ssbtp96 -a(V001 -p97 -g1 -(g29 -g3 -Ntp98 -Rp99 -(dp100 -g8 -V001 -p101 -sg23 -VVP_ISA_F007_S001_I001 -p102 -sg35 -Vcsrrs rd, rs1, csr\u000ard = Zext([csr]); csr = [rs1] | csr\u000aNote that not all bits of csr will be writable. -p103 -sg37 -VISA Chapter 9 -p104 -sg39 -VInput operand:\u000a\u000aNon-zero and zero rs1 operands are used (if rs1 != x0) -p105 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp106 -sg15 -(lp107 -sg52 -(lp108 -sg13 -(dp109 -g55 -I0 -ssbtp110 -asg71 -(lp111 -sg52 -(lp112 -sg13 -(dp113 -sbtp114 -a(V002_CSRRC -p115 -g1 -(g18 -g3 -Ntp116 -Rp117 -(dp118 -g22 -I2 -sg8 -g115 -sg23 -VVP_IP007_P002 -p119 -sg25 -(dp120 -sg12 -I2 -sg15 -(lp121 -(V000 -p122 -g1 -(g29 -g3 -Ntp123 -Rp124 -(dp125 -g8 -V000 -p126 -sg23 -VVP_ISA_F007_S002_I000 -p127 -sg35 -Vcsrrs rd, rs1, csr\u000ard = Zext([csr]); csr = ~[rs1] | csr\u000aNote that not all bits of csr will be writable. -p128 -sg37 -VISA Chapter 9 -p129 -sg39 -VRegister operands:\u000a\u000aAll possible rs1 registers are used\u000aAll possible rd registers are used\u000aAll supported CSRs are used\u000aAll possible register combinations where rs1 == rd are used -p130 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp131 -sg15 -(lp132 -sg52 -(lp133 -sg13 -(dp134 -g55 -I0 -ssbtp135 -a(V001 -p136 -g1 -(g29 -g3 -Ntp137 -Rp138 -(dp139 -g8 -V001 -p140 -sg23 -VVP_ISA_F007_S002_I001 -p141 -sg35 -Vcsrrs rd, rs1, csr\u000ard = Zext([csr]); csr = ~[rs1] | csr\u000aNote that not all bits of csr will be writable. -p142 -sg37 -VISA Chapter 9 -p143 -sg39 -VInput operand:\u000a\u000aNon-zero and zero rs1 operands are used (if rs1 != x0) -p144 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp145 -sg15 -(lp146 -sg52 -(lp147 -sg13 -(dp148 -g55 -I0 -ssbtp149 -asg71 -(lp150 -sg52 -(lp151 -sg13 -(dp152 -sbtp153 -a(V003_CSRRWI -p154 -g1 -(g18 -g3 -Ntp155 -Rp156 -(dp157 -g22 -I2 -sg8 -g154 -sg23 -VVP_IP007_P003 -p158 -sg25 -(dp159 -sg12 -I3 -sg15 -(lp160 -(V000 -p161 -g1 -(g29 -g3 -Ntp162 -Rp163 -(dp164 -g8 -V000 -p165 -sg23 -VVP_ISA_F007_S003_I000 -p166 -sg35 -Vcsrrwi rd, imm[4:0], csr\u000ard = Zext([csr]); csr = Zext(imm[4:0])\u000aIf rd == x0 then CSR is not read. -p167 -sg37 -VISA Chapter 9 -p168 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used\u000aAll supported CSRs are used -p169 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp170 -sg15 -(lp171 -sg52 -(lp172 -sg13 -(dp173 -g55 -I0 -ssbtp174 -a(V001 -p175 -g1 -(g29 -g3 -Ntp176 -Rp177 -(dp178 -g8 -V001 -p179 -sg23 -VVP_ISA_F007_S003_I001 -p180 -sg35 -Vcsrrwi rd, imm[4:0], csr\u000ard = Zext([csr]); csr = Zext(imm[4:0])\u000aIf rd == x0 then CSR is not read. -p181 -sg37 -VISA Chapter 9 -p182 -sg39 -VInput operand:\u000a\u000aNon-zero and zero imm[4:0] operands are used\u000aAll bits of imm[4:0] are toggled -p183 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp184 -sg15 -(lp185 -sg52 -(lp186 -sg13 -(dp187 -g55 -I0 -ssbtp188 -asg71 -(lp189 -sg52 -(lp190 -sg13 -(dp191 -sbtp192 -a(V004_CSRRSI -p193 -g1 -(g18 -g3 -Ntp194 -Rp195 -(dp196 -g22 -I2 -sg8 -g193 -sg23 -VVP_IP007_P004 -p197 -sg25 -(dp198 -sg12 -I4 -sg15 -(lp199 -(V000 -p200 -g1 -(g29 -g3 -Ntp201 -Rp202 -(dp203 -g8 -V000 -p204 -sg23 -VVP_ISA_F007_S004_I000 -p205 -sg35 -Vcsrrsi rd, imm[4:0], csr\u000ard = Zext([csr]); csr = Zext(imm[4:0]) | csr\u000aNote that not all bits of csr will be writable. -p206 -sg37 -VISA Chapter 9 -p207 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used\u000aAll supported CSRs are used -p208 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp209 -sg15 -(lp210 -sg52 -(lp211 -sg13 -(dp212 -g55 -I0 -ssbtp213 -a(V001 -p214 -g1 -(g29 -g3 -Ntp215 -Rp216 -(dp217 -g8 -V001 -p218 -sg23 -VVP_ISA_F007_S004_I001 -p219 -sg35 -Vcsrrsi rd, imm[4:0], csr\u000ard = Zext([csr]); csr = Zext(imm[4:0]) | csr\u000aNote that not all bits of csr will be writable. -p220 -sg37 -VISA Chapter 9 -p221 -sg39 -VInput operand:\u000a\u000aNon-zero and zero imm[4:0] operands are used\u000aAll bits of imm[4:0] are toggled -p222 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp223 -sg15 -(lp224 -sg52 -(lp225 -sg13 -(dp226 -g55 -I0 -ssbtp227 -asg71 -(lp228 -sg52 -(lp229 -sg13 -(dp230 -sbtp231 -a(V005_CSRRCI -p232 -g1 -(g18 -g3 -Ntp233 -Rp234 -(dp235 -g22 -I2 -sg8 -g232 -sg23 -VVP_IP007_P005 -p236 -sg25 -(dp237 -sg12 -I5 -sg15 -(lp238 -(V000 -p239 -g1 -(g29 -g3 -Ntp240 -Rp241 -(dp242 -g8 -V000 -p243 -sg23 -VVP_ISA_F007_S005_I000 -p244 -sg35 -Vcsrrs rd, imm[4:0], csr\u000ard = Zext([csr]); csr = ~(Zext(imm[4:0])) | csr\u000aNote that not all bits of csr will be writable. -p245 -sg37 -VISA Chapter 9 -p246 -sg39 -VRegister operands:\u000a\u000aAll possible rd registers are used\u000aAll supported CSRs are used -p247 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp248 -sg15 -(lp249 -sg52 -(lp250 -sg13 -(dp251 -g55 -I0 -ssbtp252 -a(V001 -p253 -g1 -(g29 -g3 -Ntp254 -Rp255 -(dp256 -g8 -V001 -p257 -sg23 -VVP_ISA_F007_S005_I001 -p258 -sg35 -Vcsrrs rd, imm[4:0], csr\u000ard = Zext([csr]); csr = ~(Zext(imm[4:0])) | csr\u000aNote that not all bits of csr will be writable. -p259 -sg37 -VISA Chapter 9 -p260 -sg39 -VInput operand:\u000a\u000aNon-zero and zero imm[4:0] operands are used\u000aAll bits of imm[4:0] are toggled -p261 -sg41 -g42 -sg43 -I3 -sg44 -I3 -sg45 -I1 -sg46 -I56 -sg47 -g42 -sg48 -g42 -sg49 -(lp262 -sg15 -(lp263 -sg52 -(lp264 -sg13 -(dp265 -g55 -I0 -ssbtp266 -asg71 -(lp267 -sg52 -(lp268 -sg13 -(dp269 -sbtp270 -asVrfu_list_0 -p271 -(lp272 -sg71 -(lp273 -sVvptool_gitrev -p274 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p275 -sVio_fmt_gitrev -p276 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p277 -sVconfig_gitrev -p278 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p279 -sVymlcfg_gitrev -p280 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p281 -sbtp282 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml new file mode 100644 index 000000000..b13e60860 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml @@ -0,0 +1,263 @@ +!Feature +next_elt_id: 6 +name: RV32Zicsr Control and Status Register (CSR) Instructions +id: 13 +display_order: 13 +subfeatures: !!omap +- 000_CSRRW: !Subfeature + name: 000_CSRRW + tag: VP_IP007_P000 + next_elt_id: 2 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S000_I000 + description: "csrrw rd, rs1, csr\nrd = Zext([csr]); csr = [rs1]" + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used\n\ + All possible rd registers are used\nAll supported CSRs are used\nAll possible\ + \ register combinations where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S000_I001 + description: "csrrw rd, rs1, csr\nrd = Zext([csr]); csr = [rs1]" + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operand:\n\nNon-zero and zero rs1 operands are used (if\ + \ rs1 != x0)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 001_CSRRS: !Subfeature + name: 001_CSRRS + tag: VP_IP007_P001 + next_elt_id: 2 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S001_I000 + description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = [rs1] | csr\nNote\ + \ that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used\n\ + All possible rd registers are used\nAll supported CSRs are used\nAll possible\ + \ register combinations where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S001_I001 + description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = [rs1] | csr\nNote\ + \ that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operand:\n\nNon-zero and zero rs1 operands are used (if\ + \ rs1 != x0)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 002_CSRRC: !Subfeature + name: 002_CSRRC + tag: VP_IP007_P002 + next_elt_id: 2 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S002_I000 + description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = ~[rs1] | csr\nNote\ + \ that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rs1 registers are used\n\ + All possible rd registers are used\nAll supported CSRs are used\nAll possible\ + \ register combinations where rs1 == rd are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S002_I001 + description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = ~[rs1] | csr\nNote\ + \ that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operand:\n\nNon-zero and zero rs1 operands are used (if\ + \ rs1 != x0)" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 003_CSRRWI: !Subfeature + name: 003_CSRRWI + tag: VP_IP007_P003 + next_elt_id: 2 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S003_I000 + description: "csrrwi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\n\ + If rd == x0 then CSR is not read." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used\nAll\ + \ supported CSRs are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S003_I001 + description: "csrrwi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\n\ + If rd == x0 then CSR is not read." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operand:\n\nNon-zero and zero imm[4:0] operands are used\n\ + All bits of imm[4:0] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 004_CSRRSI: !Subfeature + name: 004_CSRRSI + tag: VP_IP007_P004 + next_elt_id: 2 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S004_I000 + description: "csrrsi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\ + \ | csr\nNote that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used\nAll\ + \ supported CSRs are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S004_I001 + description: "csrrsi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\ + \ | csr\nNote that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operand:\n\nNon-zero and zero imm[4:0] operands are used\n\ + All bits of imm[4:0] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +- 005_CSRRCI: !Subfeature + name: 005_CSRRCI + tag: VP_IP007_P005 + next_elt_id: 2 + display_order: 5 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F007_S005_I000 + description: "csrrs rd, imm[4:0], csr\nrd = Zext([csr]); csr = ~(Zext(imm[4:0]))\ + \ | csr\nNote that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Register operands:\n\nAll possible rd registers are used\nAll\ + \ supported CSRs are used" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_ISA_F007_S005_I001 + description: "csrrs rd, imm[4:0], csr\nrd = Zext([csr]); csr = ~(Zext(imm[4:0]))\ + \ | csr\nNote that not all bits of csr will be writable." + reqt_doc: ISA Chapter 9 + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Input operand:\n\nNon-zero and zero imm[4:0] operands are used\n\ + All bits of imm[4:0] are toggled" + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.pck b/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.pck deleted file mode 100644 index d3b9272ec..000000000 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.pck +++ /dev/null @@ -1,157 +0,0 @@ -(VRV32Zifencei Instruction-Fetch Fence -p0 -ccopy_reg -_reconstructor -p1 -(cvp_pack -Ip -p2 -c__builtin__ -object -p3 -Ntp4 -Rp5 -(dp6 -Vprop_count -p7 -I1 -sVname -p8 -g0 -sVprop_list -p9 -(dp10 -sVip_num -p11 -I14 -sVwid_order -p12 -I14 -sVrfu_dict -p13 -(dp14 -sVrfu_list -p15 -(lp16 -(V000_FENCE.I -p17 -g1 -(cvp_pack -Prop -p18 -g3 -Ntp19 -Rp20 -(dp21 -Vitem_count -p22 -I1 -sg8 -g17 -sVtag -p23 -VVP_IP006_P000 -p24 -sVitem_list -p25 -(dp26 -sg12 -I0 -sg15 -(lp27 -(V000 -p28 -g1 -(cvp_pack -Item -p29 -g3 -Ntp30 -Rp31 -(dp32 -g8 -V000 -p33 -sg23 -VVP_ISA_F006_S000_I000 -p34 -sVdescription -p35 -VFence.I instruction executed\u000aImplementation is core-specific -p36 -sVpurpose -p37 -VUnprivileged ISA\u000aChapter 3 -p38 -sVverif_goals -p39 -VFence.I instruction is executed -p40 -sVcoverage_loc -p41 -Visacov.rv32zifencei_fence_i_cg -p42 -sVpfc -p43 -I3 -sVtest_type -p44 -I3 -sVcov_method -p45 -I1 -sVcores -p46 -I56 -sVcomments -p47 -V -p48 -sVstatus -p49 -g48 -sVsimu_target_list -p50 -(lp51 -sg15 -(lp52 -sVrfu_list_2 -p53 -(lp54 -sg13 -(dp55 -Vlock_status -p56 -I0 -ssbtp57 -asVrfu_list_1 -p58 -(lp59 -sg53 -(lp60 -sg13 -(dp61 -sbtp62 -asVrfu_list_0 -p63 -(lp64 -sg58 -(lp65 -sVvptool_gitrev -p66 -V$Id: af214b54d38e440023a14011aefff4dabfd5f5ad $ -p67 -sVio_fmt_gitrev -p68 -V$Id: 052d0c6f3d12d7984d208b14555a56b2f0c2485d $ -p69 -sVconfig_gitrev -p70 -V$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $ -p71 -sVymlcfg_gitrev -p72 -V$Id: 286c689bd48b7a58f9a37754267895cffef1270c $ -p73 -sbtp74 -. \ No newline at end of file diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml new file mode 100644 index 000000000..b12d713c9 --- /dev/null +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml @@ -0,0 +1,32 @@ +!Feature +next_elt_id: 1 +name: RV32Zifencei Instruction-Fetch Fence +id: 14 +display_order: 14 +subfeatures: !!omap +- 000_FENCE.I: !Subfeature + name: 000_FENCE.I + tag: VP_IP006_P000 + next_elt_id: 1 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_ISA_F006_S000_I000 + description: "Fence.I instruction executed\nImplementation is core-specific" + reqt_doc: "Unprivileged ISA\nChapter 3" + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Fence.I instruction is executed + pfc: 3 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: isacov.rv32zifencei_fence_i_cg + comments: '' +vptool_gitrev: '$Id: 755afe774cedc2d4910aa802ee20a1f485c1236e $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' From 33d8a6499706639d0f9cfffe1ccf683a545e34dc Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 13 Feb 2023 17:59:30 +0100 Subject: [PATCH 036/183] DV plans: Update ISA_RV32 item tags: match feature order, remove duplicates. * cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml: Name tags after feature number used in DB file name. Use 'ISA_RV32' in tag names to match project name. * cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml: Ditto. * cva6/docs/VerifPlans/ISA_RV32/runme.sh (PROJECT_NAME): USe more explicit printable name. (PROJECT_IDENT): Use same name as in directory naming to prevent future ambiguity with 64b ISA. Signed-off-by: Zbigniew Chamski --- cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml | 66 ++++++++--------- cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml | 60 +++++++-------- cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml | 48 ++++++------ cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml | 42 +++++------ cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml | 2 +- cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml | 6 +- cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml | 24 +++--- cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml | 32 ++++---- cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml | 16 ++-- cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml | 72 +++++++++--------- cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml | 86 +++++++++++----------- cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml | 28 +++---- cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml | 20 ++--- cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml | 24 +++--- cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml | 2 +- cva6/docs/VerifPlans/ISA_RV32/runme.sh | 4 +- 16 files changed, 266 insertions(+), 266 deletions(-) diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml index 70b22805d..4fa8fffdf 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP000.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S000_I000 + tag: VP_ISA_RV32_F000_S000_I000 description: "addi rd, rs1, imm[11:0]\nrd = rs1 + Sext(imm[11:0])\nArithmetic\ \ overflow is lost and ignored" reqt_doc: "ISA\nChapter 2.4" @@ -31,7 +31,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S000_I001 + tag: VP_ISA_RV32_F000_S000_I001 description: "addi rd, rs1, imm[11:0]\nrd = rs1 + Sext(imm[11:0])\nArithmetic\ \ overflow is lost and ignored" reqt_doc: "ISA\nChapter 2.4" @@ -52,7 +52,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S000_I002 + tag: VP_ISA_RV32_F000_S000_I002 description: "addi rd, rs1, imm[11:0]\nrd = rs1 + Sext(imm[11:0])\nArithmetic\ \ overflow is lost and ignored" reqt_doc: "ISA\nChapter 2.4" @@ -76,7 +76,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S001_I000 + tag: VP_ISA_RV32_F000_S001_I000 description: "xori rd, rs1, imm[11:0]\nrd = rs1 ^ Sext(imm[11:0])\nNote: this\ \ is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -95,7 +95,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S001_I001 + tag: VP_ISA_RV32_F000_S001_I001 description: "xori rd, rs1, imm[11:0]\nrd = rs1 ^ Sext(imm[11:0])\nNote: this\ \ is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -116,7 +116,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S001_I002 + tag: VP_ISA_RV32_F000_S001_I002 description: "xori rd, rs1, imm[11:0]\nrd = rs1 ^ Sext(imm[11:0])\nNote: this\ \ is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -140,7 +140,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S002_I000 + tag: VP_ISA_RV32_F000_S002_I000 description: "ori rd, rs1, imm[11:0]\nrd = rs1 | Sext(imm[11:0])\nNote: this\ \ is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -159,7 +159,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S002_I001 + tag: VP_ISA_RV32_F000_S002_I001 description: "ori rd, rs1, imm[11:0]\nrd = rs1 | Sext(imm[11:0])\nNote: this\ \ is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -180,7 +180,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S002_I002 + tag: VP_ISA_RV32_F000_S002_I002 description: "ori rd, rs1, imm[11:0]\nrd = rs1 | Sext(imm[11:0])\nNote: this\ \ is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -204,7 +204,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S003_I000 + tag: VP_ISA_RV32_F000_S003_I000 description: "andi rd, rs1, imm[11:0]\nrd = rs1 & Sext(imm[11:0])\nNote:\ \ this is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -223,7 +223,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S003_I001 + tag: VP_ISA_RV32_F000_S003_I001 description: "andi rd, rs1, imm[11:0]\nrd = rs1 & Sext(imm[11:0])\nNote:\ \ this is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -244,7 +244,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S003_I002 + tag: VP_ISA_RV32_F000_S003_I002 description: "andi rd, rs1, imm[11:0]\nrd = rs1 & Sext(imm[11:0])\nNote:\ \ this is a bitwise, not logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -268,7 +268,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S004_I000 + tag: VP_ISA_RV32_F000_S004_I000 description: "slti rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 : 0\n\ Both imm and rs1 treated as signed numbers" reqt_doc: "ISA\nChapter 2.4" @@ -287,7 +287,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S004_I001 + tag: VP_ISA_RV32_F000_S004_I001 description: "slti rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 : 0\n\ Both imm and rs1 treated as signed numbers" reqt_doc: "ISA\nChapter 2.4" @@ -308,7 +308,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S004_I002 + tag: VP_ISA_RV32_F000_S004_I002 description: "slti rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 : 0\n\ Both imm and rs1 treated as signed numbers" reqt_doc: "ISA\nChapter 2.4" @@ -331,7 +331,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S005_I000 + tag: VP_ISA_RV32_F000_S005_I000 description: "sltiu rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 :\ \ 0\nBoth imm and rs1 treated as unsigned numbers" reqt_doc: "ISA\nChapter 2.4" @@ -351,7 +351,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S005_I001 + tag: VP_ISA_RV32_F000_S005_I001 description: "sltiu rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 :\ \ 0\nBoth imm and rs1 treated as unsigned numbers" reqt_doc: "ISA\nChapter 2.4" @@ -372,7 +372,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S005_I002 + tag: VP_ISA_RV32_F000_S005_I002 description: "sltiu rd, rs1, imm[11:0]\nrd = (rs1 < Sext(imm[11:0]) ? 1 :\ \ 0\nBoth imm and rs1 treated as unsigned numbers" reqt_doc: "ISA\nChapter 2.4" @@ -395,7 +395,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S006_I000 + tag: VP_ISA_RV32_F000_S006_I000 description: "slli rd, rs, imm[4:0]\nrd = rs << imm[4:0]\nZeros are shirfted\ \ into lower bits" reqt_doc: "ISA\nChapter 2.4" @@ -414,7 +414,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S006_I001 + tag: VP_ISA_RV32_F000_S006_I001 description: "slli rd, rs, imm[4:0]\nrd = rs << imm[4:0]\nZeros are shirfted\ \ into lower bits" reqt_doc: "ISA\nChapter 2.4" @@ -434,7 +434,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S006_I002 + tag: VP_ISA_RV32_F000_S006_I002 description: "slli rd, rs, imm[4:0]\nrd = rs << imm[4:0]\nZeros are shirfted\ \ into lower bits" reqt_doc: "ISA\nChapter 2.4" @@ -458,7 +458,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S007_I000 + tag: VP_ISA_RV32_F000_S007_I000 description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ \ into upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -477,7 +477,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S007_I001 + tag: VP_ISA_RV32_F000_S007_I001 description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ \ into upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -497,7 +497,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S007_I002 + tag: VP_ISA_RV32_F000_S007_I002 description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ \ into upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -521,7 +521,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S008_I000 + tag: VP_ISA_RV32_F000_S008_I000 description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nThe original sign\ \ bit is copied into the vacated upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -540,7 +540,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S008_I001 + tag: VP_ISA_RV32_F000_S008_I001 description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nThe original sign\ \ bit is copied into the vacated upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -560,7 +560,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S008_I002 + tag: VP_ISA_RV32_F000_S008_I002 description: "srli rd, rs, imm[4:0]\nrd = rs >> imm[4:0]\nZeros are shirfted\ \ into upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -584,7 +584,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S009_I000 + tag: VP_ISA_RV32_F000_S009_I000 description: "lui rd, imm[19:0]\nrd = imm[19:0] << 12\nrd[11:0] is zero-filled." reqt_doc: "ISA\nChapter 2.4" ref_mode: '' @@ -600,7 +600,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S009_I001 + tag: VP_ISA_RV32_F000_S009_I001 description: "lui rd, imm[19:0]\nrd = imm[19:0] << 12\nrd[11:0] is zero-filled." reqt_doc: "ISA\nChapter 2.4" ref_mode: '' @@ -617,7 +617,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S009_I002 + tag: VP_ISA_RV32_F000_S009_I002 description: "lui rd, imm[19:0]\nrd = imm[19:0] << 12\nrd[11:0] is zero-filled." reqt_doc: "ISA\nChapter 2.4" ref_mode: '' @@ -640,7 +640,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F011_S010_I000 + tag: VP_ISA_RV32_F000_S010_I000 description: "auipc rd, imm[19:0]\nrd = pc + (imm[19:0] << 12)\npc is address\ \ of auipc instruction\n\nAssumption: arithmetic overflow is lost and ignored." reqt_doc: "ISA\nChapter 2.4" @@ -657,7 +657,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F011_S010_I001 + tag: VP_ISA_RV32_F000_S010_I001 description: "auipc rd, imm[19:0]\nrd = pc + (imm[19:0] << 12)\npc is address\ \ of auipc instruction\n\nAssumption: arithmetic overflow is lost and ignored." reqt_doc: "ISA\nChapter 2.4" @@ -675,7 +675,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F011_S010_I002 + tag: VP_ISA_RV32_F000_S010_I002 description: "auipc rd, imm[19:0]\nrd = pc + (imm[19:0] << 12)\npc is address\ \ of auipc instruction\n\nAssumption: arithmetic overflow is lost and ignored." reqt_doc: "ISA\nChapter 2.4" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml index 81184060b..3c9c81846 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP001.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S000_I000 + tag: VP_ISA_RV32_F001_S000_I000 description: "add rd, rs1, rs2\nrd = rs1 + rs2\nArithmetic overflow is lost\ \ and ignored" reqt_doc: "ISA\nChapter 2.4" @@ -33,7 +33,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S000_I001 + tag: VP_ISA_RV32_F001_S000_I001 description: "add rd, rs1, rs2\nrd = rs1 + rs2\nArithmetic overflow is lost\ \ and ignored" reqt_doc: "ISA\nChapter 2.4" @@ -54,7 +54,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S000_I002 + tag: VP_ISA_RV32_F001_S000_I002 description: "add rd, rs1, rs2\nrd = rs1 + rs2\nArithmetic overflow is lost\ \ and ignored" reqt_doc: "ISA\nChapter 2.4" @@ -78,7 +78,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S001_I000 + tag: VP_ISA_RV32_F001_S001_I000 description: "sub rd, rs1, rs2\nrd = rs1 - rs2\nArithmetic underflow is ignored" reqt_doc: "ISA\nChapter 2.4" ref_mode: '' @@ -98,7 +98,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S001_I001 + tag: VP_ISA_RV32_F001_S001_I001 description: "sub rd, rs1, rs2\nrd = rs1 - rs2\nArithmetic underflow is ignored" reqt_doc: "ISA\nChapter 2.4" ref_mode: '' @@ -118,7 +118,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S001_I002 + tag: VP_ISA_RV32_F001_S001_I002 description: "sub rd, rs1, rs2\nrd = rs1 - rs2\nArithmetic underflow is ignored" reqt_doc: "ISA\nChapter 2.4" ref_mode: '' @@ -141,7 +141,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S002_I000 + tag: VP_ISA_RV32_F001_S002_I000 description: "and rd, rs1, rs2\nrd = rs1 & rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -164,7 +164,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S002_I001 + tag: VP_ISA_RV32_F001_S002_I001 description: "and rd, rs1, rs2\nrd = rs1 & rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -185,7 +185,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S002_I002 + tag: VP_ISA_RV32_F001_S002_I002 description: "and rd, rs1, rs2\nrd = rs1 & rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -209,7 +209,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S003_I000 + tag: VP_ISA_RV32_F001_S003_I000 description: "or rd, rs1, rs2\nrd = rs1 | rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -230,7 +230,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S003_I001 + tag: VP_ISA_RV32_F001_S003_I001 description: "or rd, rs1, rs2\nrd = rs1 | rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -251,7 +251,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S003_I002 + tag: VP_ISA_RV32_F001_S003_I002 description: "or rd, rs1, rs2\nrd = rs1 | rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -275,7 +275,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S004_I000 + tag: VP_ISA_RV32_F001_S004_I000 description: "xor rd, rs1, rs2\nrd = rs1 ^ rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -296,7 +296,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S004_I001 + tag: VP_ISA_RV32_F001_S004_I001 description: "xor rd, rs1, rs2\nrd = rs1 ^ rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -317,7 +317,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S004_I002 + tag: VP_ISA_RV32_F001_S004_I002 description: "xor rd, rs1, rs2\nrd = rs1 ^ rs2\nNote: this is a bitwise, not\ \ logical operation" reqt_doc: "ISA\nChapter 2.4" @@ -341,7 +341,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S005_I000 + tag: VP_ISA_RV32_F001_S005_I000 description: "slt rd, rs1, rs2\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1 ad rs2\ \ treated as signed numbers" reqt_doc: "ISA\nChapter 2.4" @@ -362,7 +362,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S005_I001 + tag: VP_ISA_RV32_F001_S005_I001 description: "slt rd, rs1, rs2\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1 ad rs2\ \ treated as signed numbers" reqt_doc: "ISA\nChapter 2.4" @@ -383,7 +383,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S005_I002 + tag: VP_ISA_RV32_F001_S005_I002 description: "slt rd, rs1, rs2\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1 ad rs2\ \ treated as signed numbers" reqt_doc: "ISA\nChapter 2.4" @@ -406,7 +406,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S006_I000 + tag: VP_ISA_RV32_F001_S006_I000 description: "sltu rd, rs1, imm[11:0]\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1\ \ and rs2 treated as unsigned numbers" reqt_doc: "ISA\nChapter 2.4" @@ -427,7 +427,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S006_I001 + tag: VP_ISA_RV32_F001_S006_I001 description: "sltu rd, rs1, imm[11:0]\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1\ \ and rs2 treated as unsigned numbers" reqt_doc: "ISA\nChapter 2.4" @@ -448,7 +448,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S006_I002 + tag: VP_ISA_RV32_F001_S006_I002 description: "sltu rd, rs1, imm[11:0]\nrd = (rs1 < rs2) ? 1 : 0\nBoth rs1\ \ and rs2 treated as unsigned numbers" reqt_doc: "ISA\nChapter 2.4" @@ -471,7 +471,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S007_I000 + tag: VP_ISA_RV32_F001_S007_I000 description: "sll rd, rs1, rs2\nrd = rs1 << rs2[4:0]\nZeros are shirfted into\ \ lower bits" reqt_doc: "ISA\nChapter 2.4" @@ -492,7 +492,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S007_I001 + tag: VP_ISA_RV32_F001_S007_I001 description: "sll rd, rs1, rs2\nrd = rs1 << rs2[4:0]\nZeros are shirfted into\ \ lower bits" reqt_doc: "ISA\nChapter 2.4" @@ -512,7 +512,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S007_I002 + tag: VP_ISA_RV32_F001_S007_I002 description: "sll rd, rs1, rs2\nrd = rs1 << rs2[4:0]\nZeros are shirfted into\ \ lower bits" reqt_doc: "ISA\nChapter 2.4" @@ -537,7 +537,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S008_I000 + tag: VP_ISA_RV32_F001_S008_I000 description: "srl rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ \ upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -558,7 +558,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S008_I001 + tag: VP_ISA_RV32_F001_S008_I001 description: "srl rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ \ upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -578,7 +578,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S008_I002 + tag: VP_ISA_RV32_F001_S008_I002 description: "srl rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ \ upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -602,7 +602,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F001_S009_I000 + tag: VP_ISA_RV32_F001_S009_I000 description: "sra rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nThe original sign bit\ \ is copied into the vacated upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -623,7 +623,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F001_S009_I001 + tag: VP_ISA_RV32_F001_S009_I001 description: "sra rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nThe original sign bit\ \ is copied into the vacated upper bits" reqt_doc: "ISA\nChapter 2.4" @@ -643,7 +643,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F001_S009_I002 + tag: VP_ISA_RV32_F001_S009_I002 description: "sra rd, rs1, rs2\nrd = rs1 >> rs2[4:0]\nZeros are shirfted into\ \ upper bits" reqt_doc: "ISA\nChapter 2.4" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml index a6903df29..1e9626072 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP002.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S000_I000 + tag: VP_ISA_RV32_F002_S000_I000 description: "jal rd, imm[20:1]\nrd = pc+4; pc += Sext({imm[20:1], 1’b0})\n\ pc is calculated using signed arithmetic\n\njal x0, imm[20:1] (special case:\ \ unconditional jump)\npc += Sext({imm[20:1], 1’b0})" @@ -30,7 +30,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S000_I001 + tag: VP_ISA_RV32_F002_S000_I001 description: "jal rd, imm[20:1]\nrd = pc+4; pc += Sext({imm[20:1], 1’b0})\n\ pc is calculated using signed arithmetic\n\njal x0, imm[20:1] (special case:\ \ unconditional jump)\npc += Sext({imm[20:1], 1’b0})" @@ -49,7 +49,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S000_I002 + tag: VP_ISA_RV32_F002_S000_I002 description: "jal rd, imm[20:1]\nrd = pc+4; pc += Sext({imm[20:1], 1’b0})\n\ pc is calculated using signed arithmetic\n\njal x0, imm[20:1] (special case:\ \ unconditional jump)\npc += Sext({imm[20:1], 1’b0})" @@ -73,7 +73,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S001_I000 + tag: VP_ISA_RV32_F002_S001_I000 description: "jalr rd, rs1, imm[11:0]\nrd = pc+4; pc = rs1 + Sext(imm[11:0])\n\ pc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -92,7 +92,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S001_I001 + tag: VP_ISA_RV32_F002_S001_I001 description: "jalr rd, rs1, imm[11:0]\nrd = pc+4; pc = rs1 + Sext(imm[11:0])\n\ pc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -111,7 +111,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S001_I002 + tag: VP_ISA_RV32_F002_S001_I002 description: "jalr rd, rs1, imm[11:0]\nrd = pc+4; pc = rs1 + Sext(imm[11:0])\n\ pc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -134,7 +134,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S002_I000 + tag: VP_ISA_RV32_F002_S002_I000 description: "beq rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1==rs2)\ \ else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -152,7 +152,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S002_I001 + tag: VP_ISA_RV32_F002_S002_I001 description: "beq rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1==rs2)\ \ else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -172,7 +172,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S002_I002 + tag: VP_ISA_RV32_F002_S002_I002 description: "beq rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1==rs2)\ \ else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -195,7 +195,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S003_I000 + tag: VP_ISA_RV32_F002_S003_I000 description: "bne rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1!=rs2)\ \ else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -213,7 +213,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S003_I001 + tag: VP_ISA_RV32_F002_S003_I001 description: "bne rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1!=rs2)\ \ else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -233,7 +233,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S003_I002 + tag: VP_ISA_RV32_F002_S003_I002 description: "bne rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1!=rs2)\ \ else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -256,7 +256,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S004_I000 + tag: VP_ISA_RV32_F002_S004_I000 description: "blt rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ < rs2) else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -274,7 +274,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S004_I001 + tag: VP_ISA_RV32_F002_S004_I001 description: "blt rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ < rs2) else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -294,7 +294,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S004_I002 + tag: VP_ISA_RV32_F002_S004_I002 description: "blt rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ < rs2) else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -317,7 +317,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S005_I000 + tag: VP_ISA_RV32_F002_S005_I000 description: "bge rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ >= rs2) else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -335,7 +335,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S005_I001 + tag: VP_ISA_RV32_F002_S005_I001 description: "bge rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ >= rs2) else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -355,7 +355,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S005_I002 + tag: VP_ISA_RV32_F002_S005_I002 description: "bge rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ >= rs2) else pc += 4\npc is calculated using signed arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -378,7 +378,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S006_I000 + tag: VP_ISA_RV32_F002_S006_I000 description: "bltu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ < rs2) else pc += 4\npc is calculated using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -396,7 +396,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S006_I001 + tag: VP_ISA_RV32_F002_S006_I001 description: "bltu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ < rs2) else pc += 4\npc is calculated using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -416,7 +416,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S006_I002 + tag: VP_ISA_RV32_F002_S006_I002 description: "bltu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ < rs2) else pc += 4\npc is calculated using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -439,7 +439,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F002_S007_I000 + tag: VP_ISA_RV32_F002_S007_I000 description: "bgeu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ >= rs2) else pc += 4\npc is calculated using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -457,7 +457,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F002_S007_I001 + tag: VP_ISA_RV32_F002_S007_I001 description: "bgeu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ >= rs2) else pc += 4\npc is calculated using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.5" @@ -477,7 +477,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F002_S007_I002 + tag: VP_ISA_RV32_F002_S007_I002 description: "bgeu rs1, rs2, imm[12:1]\npc += Sext({imm[12:1], 1’b0}) if (rs1\ \ >= rs2) else pc += 4\npc is calculated using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.5" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml index cf67b09c1..0fdce09e6 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP003.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S000_I000 + tag: VP_ISA_RV32_F003_S000_I000 description: "lb rd, rs1, imm\nrd = Sext(M[rs1+imm][0:7])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -31,7 +31,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S000_I001 + tag: VP_ISA_RV32_F003_S000_I001 description: "lb rd, rs1, imm\nrd = Sext(M[rs1+imm][0:7])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -51,7 +51,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F003_S000_I002 + tag: VP_ISA_RV32_F003_S000_I002 description: "lb rd, rs1, imm\nrd = Sext(M[rs1+imm][0:7])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -75,7 +75,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S001_I000 + tag: VP_ISA_RV32_F003_S001_I000 description: "lh rd, rs1, imm\nrd = Sext(M[rs1+imm][0:15])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -94,7 +94,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S001_I001 + tag: VP_ISA_RV32_F003_S001_I001 description: "lh rd, rs1, imm\nrd = Sext(M[rs1+imm][0:15])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -115,7 +115,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F003_S001_I002 + tag: VP_ISA_RV32_F003_S001_I002 description: "lh rd, rs1, imm\nrd = Sext(M[rs1+imm][0:15])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -139,7 +139,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S002_I000 + tag: VP_ISA_RV32_F003_S002_I000 description: "lw rd, rs1, imm\nrd = Sext(M[rs1+imm][0:31])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -158,7 +158,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S002_I001 + tag: VP_ISA_RV32_F003_S002_I001 description: "lw rd, rs1, imm\nrd = Sext(M[rs1+imm][0:31])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -179,7 +179,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F003_S002_I002 + tag: VP_ISA_RV32_F003_S002_I002 description: "lw rd, rs1, imm\nrd = Sext(M[rs1+imm][0:31])\nrd is calculated\ \ using signed arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -203,7 +203,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S003_I000 + tag: VP_ISA_RV32_F003_S003_I000 description: "lbu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:7])\nrd is calculated\ \ using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -222,7 +222,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S003_I001 + tag: VP_ISA_RV32_F003_S003_I001 description: "lbu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:7])\nrd is calculated\ \ using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -242,7 +242,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F003_S003_I002 + tag: VP_ISA_RV32_F003_S003_I002 description: "lbu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:7])\nrd is calculated\ \ using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -266,7 +266,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S004_I000 + tag: VP_ISA_RV32_F003_S004_I000 description: "lhu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:15])\nrd is calculated\ \ using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -285,7 +285,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S004_I001 + tag: VP_ISA_RV32_F003_S004_I001 description: "lhu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:15])\nrd is calculated\ \ using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -306,7 +306,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F003_S004_I002 + tag: VP_ISA_RV32_F003_S004_I002 description: "lhu rd, rs1, imm\nrd = Zext(M[rs1+imm][0:15])\nrd is calculated\ \ using unsigned arithmetic" reqt_doc: "ISA\nChapter 2.6" @@ -330,7 +330,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S005_I000 + tag: VP_ISA_RV32_F003_S005_I000 description: "sb rs1, rs2, imm\nM[rs1+imm][0:7] = rs2[0:7]" reqt_doc: "ISA\nChapter 2.6" ref_mode: '' @@ -347,7 +347,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S005_I001 + tag: VP_ISA_RV32_F003_S005_I001 description: "sb rs1, rs2, imm\nM[rs1+imm][0:7] = rs2[0:7]" reqt_doc: "ISA\nChapter 2.6" ref_mode: '' @@ -372,7 +372,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S006_I000 + tag: VP_ISA_RV32_F003_S006_I000 description: "sh rs1, rs2, imm\nM[rs1+imm][0:15] = rs2[0:15]" reqt_doc: "ISA\nChapter 2.6" ref_mode: '' @@ -389,7 +389,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S006_I001 + tag: VP_ISA_RV32_F003_S006_I001 description: "sh rs1, rs2, imm\nM[rs1+imm][0:15] = rs2[0:15]" reqt_doc: "ISA\nChapter 2.6" ref_mode: '' @@ -414,7 +414,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F003_S007_I000 + tag: VP_ISA_RV32_F003_S007_I000 description: "sw rs1, rs2, imm\nM[rs1+imm][0:31] = rs2[0:31]" reqt_doc: "ISA\nChapter 2.6" ref_mode: '' @@ -431,7 +431,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F003_S007_I001 + tag: VP_ISA_RV32_F003_S007_I001 description: "sw rs1, rs2, imm\nM[rs1+imm][0:31] = rs2[0:31]" reqt_doc: "ISA\nChapter 2.6" ref_mode: '' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml index 01a61498b..13e030135 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP004.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F004_S000_I000 + tag: VP_ISA_RV32_F004_S000_I000 description: "Fence operation executed\nImplementation is microarchitecture\ \ specific" reqt_doc: "ISA\nChapter 2.7" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml index 85fd2a35c..7de113c11 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP005.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F005_S000_I000 + tag: VP_ISA_RV32_F005_S000_I000 description: Software exception vector entered reqt_doc: "ISA\nChapter 2.8" ref_mode: '' @@ -28,7 +28,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F005_S000_I001 + tag: VP_ISA_RV32_F005_S000_I001 description: Return control to a debugger reqt_doc: "ISA\nChapter 2.8" ref_mode: '' @@ -50,7 +50,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F005_S001_I000 + tag: VP_ISA_RV32_F005_S001_I000 description: Return control to a debugger reqt_doc: "ISA\nChapter 2.8" ref_mode: '' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml index fa7e67190..ad8ffc9a4 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP006.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F000_S000_I000 + tag: VP_ISA_RV32_F006_S000_I000 description: "mul rd, rs1, rs2\nx[rd] = x[rs1] * x[rs2]\nArithmetic overflow\ \ is ignored." reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -33,7 +33,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F000_S000_I001 + tag: VP_ISA_RV32_F006_S000_I001 description: "mul rd, rs1, rs2\nx[rd] = x[rs1] * x[rs2]\nArithmetic overflow\ \ is ignored." reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -54,7 +54,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F000_S000_I002 + tag: VP_ISA_RV32_F006_S000_I002 description: "mul rd, rs1, rs2\nx[rd] = x[rs1] * x[rs2]\nArithmetic overflow\ \ is ignored." reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -78,7 +78,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F000_S001_I000 + tag: VP_ISA_RV32_F006_S001_I000 description: "mulh rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nBoth\ \ rs1 and rs2 treated as signed numbers" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -99,7 +99,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F000_S001_I001 + tag: VP_ISA_RV32_F006_S001_I001 description: "mulh rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nBoth\ \ rs1 and rs2 treated as signed numbers" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -120,7 +120,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F000_S001_I002 + tag: VP_ISA_RV32_F006_S001_I002 description: "mulh rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nBoth\ \ rs1 and rs2 treated as signed numbers" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -144,7 +144,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F000_S002_I000 + tag: VP_ISA_RV32_F006_S002_I000 description: "mulhu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >> XLEN\nBoth\ \ rs1 and rs2 treated as unsigned numbers" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -165,7 +165,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F000_S002_I001 + tag: VP_ISA_RV32_F006_S002_I001 description: "mulhu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >> XLEN\nBoth\ \ rs1 and rs2 treated as unsigned numbers" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -186,7 +186,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F000_S002_I002 + tag: VP_ISA_RV32_F006_S002_I002 description: "mulhu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >> XLEN\nBoth\ \ rs1 and rs2 treated as unsigned numbers" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -210,7 +210,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F000_S003_I000 + tag: VP_ISA_RV32_F006_S003_I000 description: "mulhsu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nrs1\ \ treated as signed number, rs2 treated as unsigned number" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -232,7 +232,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F000_S003_I001 + tag: VP_ISA_RV32_F006_S003_I001 description: "mulhsu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nrs1\ \ treated as signed number, rs2 treated as unsigned number" reqt_doc: "Unprivileged ISA\nChapter 7.1" @@ -253,7 +253,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F000_S003_I002 + tag: VP_ISA_RV32_F006_S003_I002 description: "mulhsu rd, rs1, rs2\nx[rd] = (x[rs1] * x[rs2]) >>s XLEN\nrs1\ \ treated as signed number, rs2 treated as unsigned number" reqt_doc: "Unprivileged ISA\nChapter 7.1" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml index bb6964c43..729b10f13 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP007.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S000_I000 + tag: VP_ISA_RV32_F007_S000_I000 description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ \ using signed arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -33,7 +33,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S000_I001 + tag: VP_ISA_RV32_F007_S000_I001 description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ \ using signed arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -54,7 +54,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F007_S000_I002 + tag: VP_ISA_RV32_F007_S000_I002 description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ \ using signed arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -74,7 +74,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F007_S000_I003 + tag: VP_ISA_RV32_F007_S000_I003 description: "div rd, rs1, rs2\nx[rd] = x[rs1] / x[rs2]\nrd is calculated\ \ using signed arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -98,7 +98,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S001_I000 + tag: VP_ISA_RV32_F007_S001_I000 description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using signed arithmetic; remainder from the same division than DIV (the\ \ sign of rd equals the sign of rs1)" @@ -120,7 +120,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S001_I001 + tag: VP_ISA_RV32_F007_S001_I001 description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using signed arithmetic; remainder from the same division than DIV (the\ \ sign of rd equals the sign of rs1)" @@ -142,7 +142,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F007_S001_I002 + tag: VP_ISA_RV32_F007_S001_I002 description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using signed arithmetic; remainder from the same division than DIV (the\ \ sign of rd equals the sign of rs1)" @@ -161,7 +161,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F007_S001_I003 + tag: VP_ISA_RV32_F007_S001_I003 description: "rem rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using signed arithmetic; remainder from the same division than DIV (the\ \ sign of rd equals the sign of rs1)" @@ -186,7 +186,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S002_I000 + tag: VP_ISA_RV32_F007_S002_I000 description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ \ using unsigned arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -207,7 +207,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S002_I001 + tag: VP_ISA_RV32_F007_S002_I001 description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ \ using unsigned arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -228,7 +228,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F007_S002_I002 + tag: VP_ISA_RV32_F007_S002_I002 description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ \ using unsigned arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -246,7 +246,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F007_S002_I003 + tag: VP_ISA_RV32_F007_S002_I003 description: "divu rd, rs1, rs2\nx[rd] = x[rs1] u/ x[rs2]\nrd is calculated\ \ using unsigned arithmetic; rounding towards zero" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -269,7 +269,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S003_I000 + tag: VP_ISA_RV32_F007_S003_I000 description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using unsigned arithmetic; remainder from the same division than DIVU" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -290,7 +290,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S003_I001 + tag: VP_ISA_RV32_F007_S003_I001 description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using unsigned arithmetic; remainder from the same division than DIVU" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -311,7 +311,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F007_S003_I002 + tag: VP_ISA_RV32_F007_S003_I002 description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using unsigned arithmetic; remainder from the same division than DIVU" reqt_doc: "Unprivileged ISA\nChapter 7.2" @@ -329,7 +329,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F007_S003_I003 + tag: VP_ISA_RV32_F007_S003_I003 description: "remu rd, rs1, rs2\nx[rd] = x[rs1] % x[rs2]\nrd is calculated\ \ using unsigned arithmetic; remainder from the same division than DIVU" reqt_doc: "Unprivileged ISA\nChapter 7.2" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml index 9677eec74..4c817cebf 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP008.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S000_I000 + tag: VP_ISA_RV32_F008_S000_I000 description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ \ with the results loaded to rd.\nMisaligned address should cause an exception" reqt_doc: "Unprivileged ISA\nChapter 8.2" @@ -31,7 +31,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S000_I001 + tag: VP_ISA_RV32_F008_S000_I001 description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ \ with the results loaded to rd.\nMisaligned address should cause an exception" reqt_doc: "Unprivileged ISA\nChapter 8.2" @@ -48,7 +48,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S000_I002 + tag: VP_ISA_RV32_F008_S000_I002 description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ \ with the results loaded to rd.\nMisaligned address should cause an exception" reqt_doc: "Unprivileged ISA\nChapter 8.2" @@ -65,7 +65,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F008_S000_I003 + tag: VP_ISA_RV32_F008_S000_I003 description: "lr.w rd, (rs1)\nrd = [rs1]\nA load occurs to address at rs1\ \ with the results loaded to rd.\nMisaligned address should cause an exception" reqt_doc: "Unprivileged ISA\nChapter 8.2" @@ -89,7 +89,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S001_I000 + tag: VP_ISA_RV32_F008_S001_I000 description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ \ from a previous LR.W fails, then rd is set to a non-zero value and the\ @@ -112,7 +112,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S001_I001 + tag: VP_ISA_RV32_F008_S001_I001 description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ \ from a previous LR.W fails, then rd is set to a non-zero value and the\ @@ -133,7 +133,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S001_I002 + tag: VP_ISA_RV32_F008_S001_I002 description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ \ from a previous LR.W fails, then rd is set to a non-zero value and the\ @@ -154,7 +154,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F008_S001_I003 + tag: VP_ISA_RV32_F008_S001_I003 description: "sc.w rd, rs2, (rs1)\n[rs1] = rs2\nrd = exokay ? 0 : 1\nA store\ \ occurs to address at rs1 with data from rs2.\nIf the reservation set\ \ from a previous LR.W fails, then rd is set to a non-zero value and the\ diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml index 3c1a267e4..75717fbf1 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP009.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S000_I000 + tag: VP_ISA_RV32_F009_S000_I000 description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ \ to the address at (rs1)" @@ -33,7 +33,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S000_I001 + tag: VP_ISA_RV32_F009_S000_I001 description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ \ to the address at (rs1)" @@ -52,7 +52,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S000_I002 + tag: VP_ISA_RV32_F009_S000_I002 description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ \ to the address at (rs1)" @@ -70,7 +70,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S000_I003 + tag: VP_ISA_RV32_F009_S000_I003 description: "amoswap.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2\nA load occurs\ \ from the address at rs1 into rd.\nThe value at rs2 is then written back\ \ to the address at (rs1)" @@ -95,7 +95,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S001_I000 + tag: VP_ISA_RV32_F009_S001_I000 description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and added using signed arithmetic and the result iis then written back\ @@ -117,7 +117,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S001_I001 + tag: VP_ISA_RV32_F009_S001_I001 description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and added using signed arithmetic and the result iis then written back\ @@ -137,7 +137,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S001_I002 + tag: VP_ISA_RV32_F009_S001_I002 description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and added using signed arithmetic and the result iis then written back\ @@ -157,7 +157,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S001_I003 + tag: VP_ISA_RV32_F009_S001_I003 description: "amoadd.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 + [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and added using signed arithmetic and the result iis then written back\ @@ -183,7 +183,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S002_I000 + tag: VP_ISA_RV32_F009_S002_I000 description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise ANDed and the result iis then written back to the address\ @@ -205,7 +205,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S002_I001 + tag: VP_ISA_RV32_F009_S002_I001 description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise ANDed and the result iis then written back to the address\ @@ -225,7 +225,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S002_I002 + tag: VP_ISA_RV32_F009_S002_I002 description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise ANDed and the result iis then written back to the address\ @@ -244,7 +244,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S002_I003 + tag: VP_ISA_RV32_F009_S002_I003 description: "amoand.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 & rs[1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise ANDed and the result iis then written back to the address\ @@ -270,7 +270,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S003_I000 + tag: VP_ISA_RV32_F009_S003_I000 description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ \ bit-wise ORed and the result iis then written back to the address at (rs1)" @@ -291,7 +291,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S003_I001 + tag: VP_ISA_RV32_F009_S003_I001 description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ \ bit-wise ORed and the result iis then written back to the address at (rs1)" @@ -310,7 +310,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S003_I002 + tag: VP_ISA_RV32_F009_S003_I002 description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ \ bit-wise ORed and the result iis then written back to the address at (rs1)" @@ -328,7 +328,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S003_I003 + tag: VP_ISA_RV32_F009_S003_I003 description: "amoor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 | [rs1]\nA load\ \ occurs from the address at rs1 into rd.\nThe values in rd and rs2 and\ \ bit-wise ORed and the result iis then written back to the address at (rs1)" @@ -353,7 +353,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S004_I000 + tag: VP_ISA_RV32_F009_S004_I000 description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise XORRed and the result iis then written back to the address\ @@ -375,7 +375,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S004_I001 + tag: VP_ISA_RV32_F009_S004_I001 description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise XORRed and the result iis then written back to the address\ @@ -395,7 +395,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S004_I002 + tag: VP_ISA_RV32_F009_S004_I002 description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise XORRed and the result iis then written back to the address\ @@ -414,7 +414,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S004_I003 + tag: VP_ISA_RV32_F009_S004_I003 description: "amoxor.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = rs2 ^ [rs1]\nA\ \ load occurs from the address at rs1 into rd.\nThe values in rd and rs2\ \ and bit-wise XORRed and the result iis then written back to the address\ @@ -440,7 +440,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S005_I000 + tag: VP_ISA_RV32_F009_S005_I000 description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the largest value\ @@ -462,7 +462,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S005_I001 + tag: VP_ISA_RV32_F009_S005_I001 description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the largest value\ @@ -482,7 +482,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S005_I002 + tag: VP_ISA_RV32_F009_S005_I002 description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the largest value\ @@ -502,7 +502,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S005_I003 + tag: VP_ISA_RV32_F009_S005_I003 description: "amomax.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the largest value\ @@ -528,7 +528,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S006_I000 + tag: VP_ISA_RV32_F009_S006_I000 description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the largest value\ @@ -550,7 +550,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S006_I001 + tag: VP_ISA_RV32_F009_S006_I001 description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the largest value\ @@ -570,7 +570,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S006_I002 + tag: VP_ISA_RV32_F009_S006_I002 description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the largest value\ @@ -589,7 +589,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S006_I003 + tag: VP_ISA_RV32_F009_S006_I003 description: "amomaxu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = max_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the largest value\ @@ -615,7 +615,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S007_I000 + tag: VP_ISA_RV32_F009_S007_I000 description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the smaller value\ @@ -637,7 +637,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S007_I001 + tag: VP_ISA_RV32_F009_S007_I001 description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the smaller value\ @@ -657,7 +657,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S007_I002 + tag: VP_ISA_RV32_F009_S007_I002 description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the smaller value\ @@ -677,7 +677,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S007_I003 + tag: VP_ISA_RV32_F009_S007_I003 description: "amomin.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_signed(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming signed numbers and the smaller value\ @@ -703,7 +703,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S008_I000 + tag: VP_ISA_RV32_F009_S008_I000 description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ @@ -725,7 +725,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S008_I001 + tag: VP_ISA_RV32_F009_S008_I001 description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ @@ -745,7 +745,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S008_I002 + tag: VP_ISA_RV32_F009_S008_I002 description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ @@ -764,7 +764,7 @@ subfeatures: !!omap comments: '' - '003': !VerifItem name: '003' - tag: VP_ISA_F009_S008_I003 + tag: VP_ISA_RV32_F009_S008_I003 description: "amominu.w rd, rs2, (rs1)\nrd = [rs1]\n[rs1] = min_unsigned(rs2,\ \ [rs1])\nA load occurs from the address at rs1 into rd.\nThe values in\ \ rd and rs2 and compared assuming unsigned numbers and the smaller value\ diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml index 21eb1d64e..eb4420529 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP010.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S000_I000 + tag: VP_ISA_RV32_F010_S000_I000 description: "c.li rd, imm[5:0]\nx[rd] = sext(imm)\nExpands to addi rd, x0,\ \ imm[5:0]. Invalid when rd=x0.\nrd is calculated using signed arithmetic" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -29,7 +29,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S000_I001 + tag: VP_ISA_RV32_F010_S000_I001 description: "c.li rd, imm[5:0]\nx[rd] = sext(imm)\nExpands to addi rd, x0,\ \ imm[5:0]. Invalid when rd=x0.\nrd is calculated using signed arithmetic" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -52,7 +52,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S001_I000 + tag: VP_ISA_RV32_F010_S001_I000 description: "c.lui rd, nzimm[17:12]\nx[rd] = sext(nzimm[17:12] << 12)\nExpands\ \ to lui rd, nzimm[17:12]. Invalid when rd = {x0, x2} or imm = 0.\nrd is\ \ calculated using signed arithmetic." @@ -70,7 +70,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S001_I001 + tag: VP_ISA_RV32_F010_S001_I001 description: "c.lui rd, nzimm[17:12]\nx[rd] = sext(nzimm[17:12] << 12)\nExpands\ \ to lui rd, nzimm[17:12]. Invalid when rd = {x0, x2} or imm = 0.\nrd is\ \ calculated using signed arithmetic." @@ -94,7 +94,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S002_I000 + tag: VP_ISA_RV32_F010_S002_I000 description: "c.addi rd, nzimm[5:0]\nx[rd] = x[rd] + sext(nzimm[5:0])\nExpands\ \ to addi rd, rd, nzimm[5:0].\nInvalid when rd=x0 or nzimm = 0. Arithmetic\ \ overflow is lost and ignored.\nrd is calculated using signed arithmetic." @@ -112,7 +112,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S002_I001 + tag: VP_ISA_RV32_F010_S002_I001 description: "c.addi rd, nzimm[5:0]\nx[rd] = x[rd] + sext(nzimm[5:0])\nExpands\ \ to addi rd, rd, nzimm[5:0].\nInvalid when rd=x0 or nzimm = 0. Arithmetic\ \ overflow is lost and ignored.\nrd is calculated using signed arithmetic." @@ -131,7 +131,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S002_I002 + tag: VP_ISA_RV32_F010_S002_I002 description: "c.addi rd, nzimm[5:0]\nx[rd] = x[rd] + sext(nzimm[5:0])\nExpands\ \ to addi rd, rd, nzimm[5:0].\nInvalid when rd=x0 or nzimm = 0. Arithmetic\ \ overflow is lost and ignored.\nrd is calculated using signed arithmetic." @@ -155,7 +155,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S003_I000 + tag: VP_ISA_RV32_F010_S003_I000 description: "c.addi16sp nzimm[9:4]\nx[2] = x[2] + sext(nzimm[9:4])\nExpands\ \ to addi x2, x2, nzimm[9:4]. Invalid when nzimm=0.\nrd is calculated using\ \ signed arithmetic." @@ -175,7 +175,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S003_I001 + tag: VP_ISA_RV32_F010_S003_I001 description: "c.addi16sp nzimm[9:4]\nx[2] = x[2] + sext(nzimm[9:4])\nExpands\ \ to addi x2, x2, nzimm[9:4]. Invalid when nzimm=0.\nrd is calculated using\ \ signed arithmetic." @@ -199,7 +199,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S004_I000 + tag: VP_ISA_RV32_F010_S004_I000 description: "c.addi4spn rd', nzuimm[9:2]\nx[8+rd'] = x[2] + nzuimm[9:2]\n\ Expands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\nrd is calculated\ \ using signed arithmetic." @@ -217,7 +217,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S004_I001 + tag: VP_ISA_RV32_F010_S004_I001 description: "c.addi4spn rd', nzuimm[9:2]\nx[8+rd'] = x[2] + nzuimm[9:2]\n\ Expands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\nrd is calculated\ \ using signed arithmetic." @@ -236,7 +236,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S004_I002 + tag: VP_ISA_RV32_F010_S004_I002 description: "c.addi4spn rd', nzuimm[9:2]\nx[8+rd'] = x[2] + nzuimm[9:2]\n\ Expands to addi rd', x2, nzuimm[9:2]. Invalid when nzuimm = 0.\nrd is calculated\ \ using signed arithmetic." @@ -260,7 +260,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S005_I000 + tag: VP_ISA_RV32_F010_S005_I000 description: "c.slli rd, uimm[5:0]\nx[rd] = x[rd] << uimm[5:0]\nExpands to\ \ slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -277,7 +277,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S005_I001 + tag: VP_ISA_RV32_F010_S005_I001 description: "c.slli rd, uimm[5:0]\nx[rd] = x[rd] << uimm[5:0]\nExpands to\ \ slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -295,7 +295,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S005_I002 + tag: VP_ISA_RV32_F010_S005_I002 description: "c.slli rd, uimm[5:0]\nx[rd] = x[rd] << uimm[5:0]\nExpands to\ \ slli rd, rd, uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0, or rd=x0." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -318,7 +318,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S006_I000 + tag: VP_ISA_RV32_F010_S006_I000 description: "c.srli rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >>u uimm[5:0]\nExpands\ \ to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0," reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -335,7 +335,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S006_I001 + tag: VP_ISA_RV32_F010_S006_I001 description: "c.srli rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >>u uimm[5:0]\nExpands\ \ to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0," reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -353,7 +353,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S006_I002 + tag: VP_ISA_RV32_F010_S006_I002 description: "c.srli rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >>u uimm[5:0]\nExpands\ \ to srli rd', rd', uimm[5:0]. Invalid when uimm[5] = 1, or uimm=0," reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -376,7 +376,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S007_I000 + tag: VP_ISA_RV32_F010_S007_I000 description: "c.srai rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >> uimm[5:0]\nExpands\ \ to srai rd', rd', uimm[5:0]." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -393,7 +393,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S007_I001 + tag: VP_ISA_RV32_F010_S007_I001 description: "c.srai rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >> uimm[5:0]\nExpands\ \ to srai rd', rd', uimm[5:0]." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -412,7 +412,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S007_I002 + tag: VP_ISA_RV32_F010_S007_I002 description: "c.srai rd', uimm[5:0]\nx[8+rd'] = x[8+rd'] >> uimm[5:0]\nExpands\ \ to srai rd', rd', uimm[5:0]." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -435,7 +435,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S008_I000 + tag: VP_ISA_RV32_F010_S008_I000 description: "c.andi rd', imm[5:0]\nx[8+rd'] = x[8+rd'] & sext(imm[5:0])\n\ Expands to andi rd', rd', imm[5:0].\nimm treated as signed number" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -452,7 +452,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S008_I001 + tag: VP_ISA_RV32_F010_S008_I001 description: "c.andi rd', imm[5:0]\nx[8+rd'] = x[8+rd'] & sext(imm[5:0])\n\ Expands to andi rd', rd', imm[5:0].\nimm treated as signed number" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -471,7 +471,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S008_I002 + tag: VP_ISA_RV32_F010_S008_I002 description: "c.andi rd', imm[5:0]\nx[8+rd'] = x[8+rd'] & sext(imm[5:0])\n\ Expands to andi rd', rd', imm[5:0].\nimm treated as signed number" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -494,7 +494,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S009_I000 + tag: VP_ISA_RV32_F010_S009_I000 description: "c.mv rd, rs2\nx[rd] = x[rs2]\nExpands to add rd, x0, rs2\nInvalid\ \ when rs2=x0 or rd=x0." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -512,7 +512,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S009_I001 + tag: VP_ISA_RV32_F010_S009_I001 description: "c.mv rd, rs2\nx[rd] = x[rs2]\nExpands to add rd, x0, rs2\nInvalid\ \ when rs2=x0 or rd=x0." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -529,7 +529,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S009_I002 + tag: VP_ISA_RV32_F010_S009_I002 description: "c.mv rd, rs2\nx[rd] = x[rs2]\nExpands to add rd, x0, rs2\nInvalid\ \ when rs2=x0 or rd=x0." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -552,7 +552,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S010_I000 + tag: VP_ISA_RV32_F010_S010_I000 description: "c.add rd, rs2\nx[rd] = x[rd] + x[rs2]\nExpands to add rd, rd,\ \ rs2. Invalid when rd=x0 or rs2=x0.\nArithmetic overflow is lost and ignored" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -569,7 +569,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S010_I001 + tag: VP_ISA_RV32_F010_S010_I001 description: "c.add rd, rs2\nx[rd] = x[rd] + x[rs2]\nExpands to add rd, rd,\ \ rs2. Invalid when rd=x0 or rs2=x0.\nArithmetic overflow is lost and ignored" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -588,7 +588,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S010_I002 + tag: VP_ISA_RV32_F010_S010_I002 description: "c.add rd, rs2\nx[rd] = x[rd] + x[rs2]\nExpands to add rd, rd,\ \ rs2. Invalid when rd=x0 or rs2=x0.\nArithmetic overflow is lost and ignored" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -612,7 +612,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S011_I000 + tag: VP_ISA_RV32_F010_S011_I000 description: "c.and rd', rs2'\nx[8+rd'] = x[8+rd'] & x[8+rs2']\nExpands to\ \ and rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -629,7 +629,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S011_I001 + tag: VP_ISA_RV32_F010_S011_I001 description: "c.and rd', rs2'\nx[8+rd'] = x[8+rd'] & x[8+rs2']\nExpands to\ \ and rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -648,7 +648,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S011_I002 + tag: VP_ISA_RV32_F010_S011_I002 description: "c.and rd', rs2'\nx[8+rd'] = x[8+rd'] & x[8+rs2']\nExpands to\ \ and rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -671,7 +671,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S012_I000 + tag: VP_ISA_RV32_F010_S012_I000 description: "c.or rd', rs2'\nx[8+rd'] = x[8+rd'] | x[8+rs2']\nExpands to\ \ or rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -688,7 +688,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S012_I001 + tag: VP_ISA_RV32_F010_S012_I001 description: "c.or rd', rs2'\nx[8+rd'] = x[8+rd'] | x[8+rs2']\nExpands to\ \ or rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -707,7 +707,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S012_I002 + tag: VP_ISA_RV32_F010_S012_I002 description: "c.or rd', rs2'\nx[8+rd'] = x[8+rd'] | x[8+rs2']\nExpands to\ \ or rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -730,7 +730,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S013_I000 + tag: VP_ISA_RV32_F010_S013_I000 description: "c.xor rd', rs2'\nx[8+rd'] = x[8+rd'] ^ x[8+rs2']\nExpands to\ \ xor rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -747,7 +747,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S013_I001 + tag: VP_ISA_RV32_F010_S013_I001 description: "c.xor rd', rs2'\nx[8+rd'] = x[8+rd'] ^ x[8+rs2']\nExpands to\ \ xor rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -766,7 +766,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S013_I002 + tag: VP_ISA_RV32_F010_S013_I002 description: "c.xor rd', rs2'\nx[8+rd'] = x[8+rd'] ^ x[8+rs2']\nExpands to\ \ xor rd', rd', rs2'." reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -789,7 +789,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S014_I000 + tag: VP_ISA_RV32_F010_S014_I000 description: "c.sub rd', rs2'\nx[8+rd'] = x[8+rd'] - x[8+rs2']\nExpands to\ \ sub rd', rd', rs2'. Arithmetic underflow is ignored" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -806,7 +806,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F008_S014_I001 + tag: VP_ISA_RV32_F010_S014_I001 description: "c.sub rd', rs2'\nx[8+rd'] = x[8+rd'] - x[8+rs2']\nExpands to\ \ sub rd', rd', rs2'. Arithmetic underflow is ignored" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -825,7 +825,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F008_S014_I002 + tag: VP_ISA_RV32_F010_S014_I002 description: "c.sub rd', rs2'\nx[8+rd'] = x[8+rd'] - x[8+rs2']\nExpands to\ \ sub rd', rd', rs2'. Arithmetic underflow is ignored" reqt_doc: "Unprivileged ISA\nChapter 16.5" @@ -848,7 +848,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F008_S015_I000 + tag: VP_ISA_RV32_F010_S015_I000 description: "c.ebreak\nRaiseException(Breakpoint)\nExpands to ebreak." reqt_doc: "Unprivileged ISA\nChapter 16.5" ref_mode: '' diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml index c95e04332..38e84fc44 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP011.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F010_S000_I000 + tag: VP_ISA_RV32_F011_S000_I000 description: "c.j imm[11:1]\npc += sext(imm)\npc is calculated using signed\ \ arithmetic\nExpands to jal x0, imm[11:1]." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -36,7 +36,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F010_S001_I000 + tag: VP_ISA_RV32_F011_S001_I000 description: "c.jal imm[11:1]\nx[1] = pc+2; pc += sext(imm)\npc is calculated\ \ using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -54,7 +54,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F010_S001_I001 + tag: VP_ISA_RV32_F011_S001_I001 description: "c.jal imm[11:1]\nx[1] = pc+2; pc += sext(imm)\npc is calculated\ \ using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -77,7 +77,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F010_S002_I000 + tag: VP_ISA_RV32_F011_S002_I000 description: "c.jr rs1\npc = x[rs1]\nExpands to jalr x0, 0(rs1). \nInvalid\ \ when rs1=x0." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -94,7 +94,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F010_S002_I001 + tag: VP_ISA_RV32_F011_S002_I001 description: "c.jr rs1\npc = x[rs1]\nExpands to jalr x0, 0(rs1). \nInvalid\ \ when rs1=x0." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -117,7 +117,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F010_S003_I000 + tag: VP_ISA_RV32_F011_S003_I000 description: "c.jalr rs1\nt = pc + 2; pc = x[rs1]; x[1] = t\nExpands to jalr\ \ x1, 0(rs1). \nInvalid when rs1=x0." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -134,7 +134,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F010_S003_I001 + tag: VP_ISA_RV32_F011_S003_I001 description: "c.jalr rs1\nt = pc + 2; pc = x[rs1]; x[1] = t\nExpands to jalr\ \ x1, 0(rs1). \nInvalid when rs1=x0." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -151,7 +151,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F010_S003_I002 + tag: VP_ISA_RV32_F011_S003_I002 description: "c.jalr rs1\nt = pc + 2; pc = x[rs1]; x[1] = t\nExpands to jalr\ \ x1, 0(rs1). \nInvalid when rs1=x0." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -174,7 +174,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F010_S004_I000 + tag: VP_ISA_RV32_F011_S004_I000 description: "c.beqz rs1', imm[8:1]\nif (x[8+rs1'] == 0) pc += sext(imm)\n\ Expands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -191,7 +191,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F010_S004_I001 + tag: VP_ISA_RV32_F011_S004_I001 description: "c.beqz rs1', imm[8:1]\nif (x[8+rs1'] == 0) pc += sext(imm)\n\ Expands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -208,7 +208,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F010_S004_I002 + tag: VP_ISA_RV32_F011_S004_I002 description: "c.beqz rs1', imm[8:1]\nif (x[8+rs1'] == 0) pc += sext(imm)\n\ Expands to beq rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -231,7 +231,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F010_S005_I000 + tag: VP_ISA_RV32_F011_S005_I000 description: "c.bnez rs1', imm[8:1]\nif (x[8+rs1'] ≠ 0) pc += sext(imm)\n\ Expands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -248,7 +248,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F010_S005_I001 + tag: VP_ISA_RV32_F011_S005_I001 description: "c.bnez rs1', imm[8:1]\nif (x[8+rs1'] ≠ 0) pc += sext(imm)\n\ Expands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" @@ -265,7 +265,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F010_S005_I002 + tag: VP_ISA_RV32_F011_S005_I002 description: "c.bnez rs1', imm[8:1]\nif (x[8+rs1'] ≠ 0) pc += sext(imm)\n\ Expands to bne rs1', x0, imm[8:1]. pc is calculated using signed arithmetic." reqt_doc: "Unprivileged ISA\nChapter 16.4" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml index 7fe21ee0d..776d2d465 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP012.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S000_I000 + tag: VP_ISA_RV32_F012_S000_I000 description: "c.lwsp rd, uimm(x2)\nx[rd] = sext(M[x[2] + uimm][0:31])\nExpands\ \ to lw rd, uimm[7:2](x2). \nInvalid when rd=x0.\nuimm treated as unsigned\ \ number" @@ -30,7 +30,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S000_I001 + tag: VP_ISA_RV32_F012_S000_I001 description: "c.lwsp rd, uimm(x2)\nx[rd] = sext(M[x[2] + uimm][0:31])\nExpands\ \ to lw rd, uimm[7:2](x2). \nInvalid when rd=x0.\nuimm treated as unsigned\ \ number" @@ -49,7 +49,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S000_I002 + tag: VP_ISA_RV32_F012_S000_I002 description: "c.lwsp rd, uimm(x2)\nx[rd] = sext(M[x[2] + uimm][0:31])\nExpands\ \ to lw rd, uimm[7:2](x2). \nInvalid when rd=x0.\nuimm treated as unsigned\ \ number" @@ -74,7 +74,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S001_I000 + tag: VP_ISA_RV32_F012_S001_I000 description: "c.swsp rs2, uimm(x2)\nM[x[2] + uimm][0:31] = x[rs2]\nExpands\ \ to sw rs2, uimm[7:2](x2).\nuimm treated as unsigned number" reqt_doc: "Unprivileged ISA\nChapter 16.3" @@ -91,7 +91,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S001_I001 + tag: VP_ISA_RV32_F012_S001_I001 description: "c.swsp rs2, uimm(x2)\nM[x[2] + uimm][0:31] = x[rs2]\nExpands\ \ to sw rs2, uimm[7:2](x2).\nuimm treated as unsigned number" reqt_doc: "Unprivileged ISA\nChapter 16.3" @@ -115,7 +115,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S002_I000 + tag: VP_ISA_RV32_F012_S002_I000 description: "c.lw rd', uimm(rs1')\nx[rd] = sext(M[x[rs1] + uimm][0:31]),\ \ where rd=8+rd' and rs1=8+rs1'\nExpands to lw rd', uimm[6:2](rs1')" reqt_doc: "Unprivileged ISA\nChapter 16.3" @@ -134,7 +134,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S002_I001 + tag: VP_ISA_RV32_F012_S002_I001 description: "c.lw rd', uimm(rs1')\nx[rd] = sext(M[x[rs1] + uimm][0:31]),\ \ where rd=8+rd' and rs1=8+rs1'\nExpands to lw rd', uimm[6:2](rs1')" reqt_doc: "Unprivileged ISA\nChapter 16.3" @@ -152,7 +152,7 @@ subfeatures: !!omap comments: '' - '002': !VerifItem name: '002' - tag: VP_ISA_F009_S002_I002 + tag: VP_ISA_RV32_F012_S002_I002 description: "c.lw rd', uimm(rs1')\nx[rd] = sext(M[x[rs1] + uimm][0:31]),\ \ where rd=8+rd' and rs1=8+rs1'\nExpands to lw rd', uimm[6:2](rs1')" reqt_doc: "Unprivileged ISA\nChapter 16.3" @@ -176,7 +176,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F009_S003_I000 + tag: VP_ISA_RV32_F012_S003_I000 description: "c.sw rs2', uimm(rs1')\nM[x[rs1] + uimm][0:31] = x[rs2], where\ \ rs2=8+rs2' and rs1=8+rs1'\nExpands to sw rs2', uimm[6:2](rs1')." reqt_doc: "Unprivileged ISA\nChapter 16.3" @@ -195,7 +195,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F009_S003_I001 + tag: VP_ISA_RV32_F012_S003_I001 description: "c.sw rs2', uimm(rs1')\nM[x[rs1] + uimm][0:31] = x[rs2], where\ \ rs2=8+rs2' and rs1=8+rs1'\nExpands to sw rs2', uimm[6:2](rs1')." reqt_doc: "Unprivileged ISA\nChapter 16.3" diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml index b13e60860..2cd64fbfc 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP013.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S000_I000 + tag: VP_ISA_RV32_F013_S000_I000 description: "csrrw rd, rs1, csr\nrd = Zext([csr]); csr = [rs1]" reqt_doc: ISA Chapter 9 ref_mode: '' @@ -30,7 +30,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S000_I001 + tag: VP_ISA_RV32_F013_S000_I001 description: "csrrw rd, rs1, csr\nrd = Zext([csr]); csr = [rs1]" reqt_doc: ISA Chapter 9 ref_mode: '' @@ -53,7 +53,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S001_I000 + tag: VP_ISA_RV32_F013_S001_I000 description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = [rs1] | csr\nNote\ \ that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -72,7 +72,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S001_I001 + tag: VP_ISA_RV32_F013_S001_I001 description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = [rs1] | csr\nNote\ \ that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -96,7 +96,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S002_I000 + tag: VP_ISA_RV32_F013_S002_I000 description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = ~[rs1] | csr\nNote\ \ that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -115,7 +115,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S002_I001 + tag: VP_ISA_RV32_F013_S002_I001 description: "csrrs rd, rs1, csr\nrd = Zext([csr]); csr = ~[rs1] | csr\nNote\ \ that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -139,7 +139,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S003_I000 + tag: VP_ISA_RV32_F013_S003_I000 description: "csrrwi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\n\ If rd == x0 then CSR is not read." reqt_doc: ISA Chapter 9 @@ -157,7 +157,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S003_I001 + tag: VP_ISA_RV32_F013_S003_I001 description: "csrrwi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\n\ If rd == x0 then CSR is not read." reqt_doc: ISA Chapter 9 @@ -181,7 +181,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S004_I000 + tag: VP_ISA_RV32_F013_S004_I000 description: "csrrsi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\ \ | csr\nNote that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -199,7 +199,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S004_I001 + tag: VP_ISA_RV32_F013_S004_I001 description: "csrrsi rd, imm[4:0], csr\nrd = Zext([csr]); csr = Zext(imm[4:0])\ \ | csr\nNote that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -223,7 +223,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F007_S005_I000 + tag: VP_ISA_RV32_F013_S005_I000 description: "csrrs rd, imm[4:0], csr\nrd = Zext([csr]); csr = ~(Zext(imm[4:0]))\ \ | csr\nNote that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 @@ -241,7 +241,7 @@ subfeatures: !!omap comments: '' - '001': !VerifItem name: '001' - tag: VP_ISA_F007_S005_I001 + tag: VP_ISA_RV32_F013_S005_I001 description: "csrrs rd, imm[4:0], csr\nrd = Zext([csr]); csr = ~(Zext(imm[4:0]))\ \ | csr\nNote that not all bits of csr will be writable." reqt_doc: ISA Chapter 9 diff --git a/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml b/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml index b12d713c9..b4fbf21f9 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml +++ b/cva6/docs/VerifPlans/ISA_RV32/VP_IP014.yml @@ -12,7 +12,7 @@ subfeatures: !!omap items: !!omap - '000': !VerifItem name: '000' - tag: VP_ISA_F006_S000_I000 + tag: VP_ISA_RV32_F014_S000_I000 description: "Fence.I instruction executed\nImplementation is core-specific" reqt_doc: "Unprivileged ISA\nChapter 3" ref_mode: '' diff --git a/cva6/docs/VerifPlans/ISA_RV32/runme.sh b/cva6/docs/VerifPlans/ISA_RV32/runme.sh index b301c7850..0af7efb8d 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/runme.sh +++ b/cva6/docs/VerifPlans/ISA_RV32/runme.sh @@ -17,11 +17,11 @@ export PLATFORM_TOP_DIR="$ROOTDIR" # Set the printable name for the project that will be used # in the human-readable documentation. -export PROJECT_NAME="ISA" +export PROJECT_NAME="ISA RISC-V 32b" # Set the alphanumerical identifier of the project that # will be used to construct file names etc. -export PROJECT_IDENT="ISA" +export PROJECT_IDENT="ISA_RV32" # Set the destination directory of Markdown files for this project. # Since it will be used by VPTOOL, it shall NOT be a relative path. From b388ebd51c592c02a7b5e9edd28398c0f0c7b654 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Tue, 14 Feb 2023 14:30:48 +0100 Subject: [PATCH 037/183] AXI: Add verification plan and files to run it with vptool Signed-off-by: Alae Eddine Ez zejjari --- cva6/docs/VerifPlans/AXI/VP_IP005.yml | 104 +++++ cva6/docs/VerifPlans/AXI/VP_IP006.yml | 179 +++++++++ cva6/docs/VerifPlans/AXI/VP_IP007.yml | 64 +++ cva6/docs/VerifPlans/AXI/VP_IP008.yml | 141 +++++++ cva6/docs/VerifPlans/AXI/runme.sh | 34 ++ cva6/docs/VerifPlans/source/dvplan_AXI.md | 461 ++++++++++++++++++++++ cva6/docs/VerifPlans/source/index.rst | 1 + 7 files changed, 984 insertions(+) create mode 100644 cva6/docs/VerifPlans/AXI/VP_IP005.yml create mode 100644 cva6/docs/VerifPlans/AXI/VP_IP006.yml create mode 100644 cva6/docs/VerifPlans/AXI/VP_IP007.yml create mode 100644 cva6/docs/VerifPlans/AXI/VP_IP008.yml create mode 100644 cva6/docs/VerifPlans/AXI/runme.sh create mode 100644 cva6/docs/VerifPlans/source/dvplan_AXI.md diff --git a/cva6/docs/VerifPlans/AXI/VP_IP005.yml b/cva6/docs/VerifPlans/AXI/VP_IP005.yml new file mode 100644 index 000000000..05353b025 --- /dev/null +++ b/cva6/docs/VerifPlans/AXI/VP_IP005.yml @@ -0,0 +1,104 @@ +!Feature +next_elt_id: 2 +name: Burst +id: 5 +display_order: 5 +subfeatures: !!omap +- 000_Control_Signals: !Subfeature + name: 000_Control_Signals + tag: VP_IP005_P000 + next_elt_id: 12 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F005_S000_I000 + description: All transaction performed by CVA6 are of type INCR. AxBURST = + 0b01 + reqt_doc: AXI Design doc - Address structure + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxBURST == 0b01 is always true while AX_VALID is + asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_1_F005_S000_I001 + description: All Read transaction performed by CVA6 are of burst lenght less + or equal to 2. ARLEN = 0b01 + reqt_doc: AXI Design doc - Address structure + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that ARLEN == 0b01 is always true while AR_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_1_F005_S000_I002 + description: All write transaction performed by CVA6 are of burst lenght equal + to 1. AWLEN = 0b00 + reqt_doc: AXI Design doc - Address structure + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AWLEN == 0b00 is always true while AW_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_1_F005_S000_I003 + description: The size of a read transfer does not exceed the width of the + data interface. The maximum value can be taking by AxSIZE is 3. + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.4.1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxSIZE <= log2(AXI_DATA_WIDTH/8) is always true while + AR_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '007': !VerifItem + name: '007' + tag: VP_1_F005_S000_I007 + description: Exclusive access transactions cannot have a length greater than + 16 beats + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A7.2.4) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxLOCK && AxLEN <= 15 is always true while AX_VALID + is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 03047594b4818fcbd06a40669e637081ff1d4fb9 $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/AXI/VP_IP006.yml b/cva6/docs/VerifPlans/AXI/VP_IP006.yml new file mode 100644 index 000000000..768ff9560 --- /dev/null +++ b/cva6/docs/VerifPlans/AXI/VP_IP006.yml @@ -0,0 +1,179 @@ +!Feature +next_elt_id: 9 +name: Signals +id: 6 +display_order: 6 +subfeatures: !!omap +- 000_ID: !Subfeature + name: 000_ID + tag: VP_IP006_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F006_S000_I000 + description: The CVA6 identify read transaction with an ID equal to 0 or 1 + reqt_doc: AXI Design doc - Transaction Identifiers + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that ARID == 0b01 || ARID == 0b00 is always true while + AR_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_1_F006_S000_I001 + description: The CVA6 identify write transaction with an ID equal to 1 + reqt_doc: AXI Design doc - Transaction Identifiers + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AWID == 0b01 is always true while AW_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +- 001_User: !Subfeature + name: 001_User + tag: VP_IP006_P001 + next_elt_id: 2 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F006_S001_I000 + description: User-defined extension for the write and read address channel + is not supported. AxUSER = 0b00 + reqt_doc: AXI Design doc - (table 2.2 and 2.5) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxUSER = 0b00 is always true while AX_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_1_F006_S001_I001 + description: User-defined extension for the write response channel is not + supported. + reqt_doc: AXI Design doc - (table 2.4) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that BUSER = 0b00 is always true while B_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +- 002_Quality_of_Service: !Subfeature + name: 002_Quality_of_Service + tag: VP_IP006_P002 + next_elt_id: 2 + display_order: 2 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F006_S002_I000 + description: Quality of Service identifier is not supported. AxQOS = 0b0000 + reqt_doc: AXI Design doc - (table 2.2 and 2.5) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxQOS = 0b0000 is always true while AX_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +- 003_Cache: !Subfeature + name: 003_Cache + tag: VP_IP006_P003 + next_elt_id: 2 + display_order: 3 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F006_S003_I000 + description: AxCACHE always take 0b0000. + reqt_doc: 'AXI Design Doc - Transaction Attributes: Memory types' + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxCACHE = 0b0000 is always true while AX_VALID is + asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +- 004_Protection: !Subfeature + name: 004_Protection + tag: VP_IP006_P004 + next_elt_id: 1 + display_order: 4 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F006_S004_I000 + description: Protection attributes always take the 0b000 + reqt_doc: AXI Design Doc - (Table 2.2 and 2.5) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxPROT = 0b000 is always true while AX_VALID is asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +- 008_Region: !Subfeature + name: 008_Region + tag: VP_IP006_P008 + next_elt_id: 1 + display_order: 8 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F006_S008_I000 + description: Region indicator is not supported. AxREGION = 0b0000 + reqt_doc: AXI Design doc - (table 2.2 and 2.5) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that AxREGION = 0b0000 is always true while AX_VALID is + asserted. + pfc: 4 + test_type: 3 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 03047594b4818fcbd06a40669e637081ff1d4fb9 $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/AXI/VP_IP007.yml b/cva6/docs/VerifPlans/AXI/VP_IP007.yml new file mode 100644 index 000000000..202bd170b --- /dev/null +++ b/cva6/docs/VerifPlans/AXI/VP_IP007.yml @@ -0,0 +1,64 @@ +!Feature +next_elt_id: 1 +name: Clock and Reset +id: 7 +display_order: 7 +subfeatures: !!omap +- 000_Signals_Value: !Subfeature + name: 000_Signals_Value + tag: VP_IP007_P000 + next_elt_id: 3 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F007_S000_I000 + description: A value of X on [Ax | x]VALID is not permitted when not in reset + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.1.2) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that reset && [Ax | x]VALID != X is always true + pfc: 4 + test_type: 4 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_1_F007_S000_I001 + description: A value of X on [Ax | x]READY is not permitted when not in reset + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.1.2) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that reset && [Ax | x]READY != X is always true + pfc: 4 + test_type: 4 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_1_F007_S000_I002 + description: '[Ax | x]VALID is LOW for the first cycle after RESET goes HIGH' + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Figure A3-1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that [Ax | x]VALID is low the first cycle after RESET + pfc: 4 + test_type: 4 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 03047594b4818fcbd06a40669e637081ff1d4fb9 $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/AXI/VP_IP008.yml b/cva6/docs/VerifPlans/AXI/VP_IP008.yml new file mode 100644 index 000000000..642c70531 --- /dev/null +++ b/cva6/docs/VerifPlans/AXI/VP_IP008.yml @@ -0,0 +1,141 @@ +!Feature +next_elt_id: 3 +name: Handshake_Process +id: 8 +display_order: 8 +subfeatures: !!omap +- '000_Stability ': !Subfeature + name: '000_Stability ' + tag: VP_IP008_P000 + next_elt_id: 2 + display_order: 0 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F008_S000_I000 + description: All signals must remain stable when [Ax | x]VALID is asserted + and [Ax | x]READY is LOW + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.2.2) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that all the signals does not change while [Ax | x]VALID + is asserted and [Ax | x]READY not yet asserted. + pfc: 4 + test_type: 4 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' + - '001': !VerifItem + name: '001' + tag: VP_1_F008_S000_I001 + description: '[Ax | x]VALID must remain asserted until [Ax | x]READY is HIGH' + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.2.1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: Ensure that [Ax | x]VALID does not change while [Ax | x]READY + is low. + pfc: 4 + test_type: 4 + cov_method: 2 + cores: 56 + coverage_loc: '' + comments: '' +- 001_Timing: !Subfeature + name: 001_Timing + tag: VP_IP008_P001 + next_elt_id: 8 + display_order: 1 + items: !!omap + - '000': !VerifItem + name: '000' + tag: VP_1_F008_S001_I000 + description: The Manager must not wait for the Subordinate to assert ARREADY + before asserting ARVALID + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Ensure that no errors are encountered as the testbench injects\ + \ random Ready-to-Valid delays. There are two cases to consider:\n\nARREADY\ + \ is asserted on or after same cycle as ARVALID\nARREADY is asserted and\ + \ deasserted during an interval when ARVALID is de-asserted" + pfc: 0 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '002': !VerifItem + name: '002' + tag: VP_1_F008_S001_I002 + description: The Manager must not wait for the Subordinate to assert AWREADY + before asserting AWVALID or WVALID. + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Ensure that no errors are encountered as the testbench injects\ + \ random Ready-to-Valid delays. There are four cases to consider: \n \ + \ \nAWREADY is asserted on or after\ + \ same cycle as AWVALID and WVALID is de-asserted\nAWREADY is asserted on\ + \ or after same cycle as WVALID and AWVALID is de-asserted\nAWREADY is\ + \ asserted on or after same cycle as AWVALID and WVALID\nAWREADY is asserted\ + \ and deasserted during an interval when AWVALID and WVALID is de-asserted" + pfc: 0 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '003': !VerifItem + name: '003' + tag: VP_1_F008_S001_I003 + description: The Manager must not wait for the Subordinate to assert WREADY + before asserting AWVALID or WVALID. + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: "Ensure that no errors are encountered as the testbench injects\ + \ random Ready-to-Valid delays. There are four cases to consider: \n \ + \ \nWREADY is asserted on or\ + \ after same cycle as AWVALID and WVALID is de-asserted\nWREADY is asserted\ + \ on or after same cycle as WVALID and AWVALID is de-asserted\nWREADY is\ + \ asserted on or after same cycle as AWVALID and WVALID\nWREADY is asserted\ + \ and deasserted during an interval when AWVALID and WVALID is de-asserted" + pfc: 0 + test_type: 3 + cov_method: 1 + cores: 56 + coverage_loc: '' + comments: '' + - '005': !VerifItem + name: '005' + tag: VP_1_F008_S001_I005 + description: The Subordinate must not wait for the Manager to assert [B | + R]READY before asserting [B | R]VALID + reqt_doc: https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) + ref_mode: '' + ref_page: '' + ref_section: '' + ref_viewer: '' + verif_goals: No specific “observable checks†to be made in simulation. Testbench + will always provide response data independently of [B | R]READY. + pfc: 0 + test_type: 10 + cov_method: 10 + cores: 56 + coverage_loc: '' + comments: '' +vptool_gitrev: '$Id: 03047594b4818fcbd06a40669e637081ff1d4fb9 $' +io_fmt_gitrev: '$Id: 7ee5d68801f5498a957bcbe23fcad87817a364c5 $' +config_gitrev: '$Id: 0422e19126dae20ffc4d5a84e4ce3de0b6eb4eb5 $' +ymlcfg_gitrev: '$Id: 286c689bd48b7a58f9a37754267895cffef1270c $' diff --git a/cva6/docs/VerifPlans/AXI/runme.sh b/cva6/docs/VerifPlans/AXI/runme.sh new file mode 100644 index 000000000..b0cfce34d --- /dev/null +++ b/cva6/docs/VerifPlans/AXI/runme.sh @@ -0,0 +1,34 @@ +############################################################################# +# Copyright (C) 2022 Thales DIS France SAS +# +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0. +# +# Original Author: Zbigniew Chamski (zbigniew.chamski@thalesgroup.com) +############################################################################# +#!/bin/sh + +# Location of project-specific directories +ROOTDIR=`readlink -f $(dirname "${BASH_SOURCE[0]}")` + +# Set up platform location. It can be anywhere but should contain +# a valid `vp_config.py` file in `vptool` directory. +# Here we use the verification tree from the example directory. +export PLATFORM_TOP_DIR="$ROOTDIR" + +# Set the printable name for the project that will be used +# in the human-readable documentation. +export PROJECT_NAME="AXI" + +# Set the alphanumerical identifier of the project that +# will be used to construct file names etc. +export PROJECT_IDENT="AXI" + +# Set the destination directory of Markdown files for this project. +# Since it will be used by VPTOOL, it shall NOT be a relative path. +export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` + +# Run VPTOOL overriding the default theme from Yaml config with 'winxpblue'. +# FIXME: Introduce a suitably named shell variable that points to the root +# directory of the tool set (TOOL_TOP etc.) +# FORNOW use a hardcoded relative path. +python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py $* diff --git a/cva6/docs/VerifPlans/source/dvplan_AXI.md b/cva6/docs/VerifPlans/source/dvplan_AXI.md new file mode 100644 index 000000000..a7399eca0 --- /dev/null +++ b/cva6/docs/VerifPlans/source/dvplan_AXI.md @@ -0,0 +1,461 @@ +# Module: AXI + +## Feature: Burst + +### Sub-feature: 000_Control_Signals + +#### Item: 000 + +* **Requirement location:** AXI Design doc - Address structure +* **Feature Description** + + All transaction performed by CVA6 are of type INCR. AxBURST = 0b01 +* **Verification Goals** + + Ensure that AxBURST == 0b01 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F005_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** AXI Design doc - Address structure +* **Feature Description** + + All Read transaction performed by CVA6 are of burst lenght less or equal to 2. ARLEN = 0b01 +* **Verification Goals** + + Ensure that ARLEN == 0b01 is always true while AR_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F005_S000_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 002 + +* **Requirement location:** AXI Design doc - Address structure +* **Feature Description** + + All write transaction performed by CVA6 are of burst lenght equal to 1. AWLEN = 0b00 +* **Verification Goals** + + Ensure that AWLEN == 0b00 is always true while AW_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F005_S000_I002 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 003 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.4.1) +* **Feature Description** + + The size of a read transfer does not exceed the width of the data interface. The maximum value can be taking by AxSIZE is 3. +* **Verification Goals** + + Ensure that AxSIZE <= log2(AXI_DATA_WIDTH/8) is always true while AR_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F005_S000_I003 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 007 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A7.2.4) +* **Feature Description** + + Exclusive access transactions cannot have a length greater than 16 beats +* **Verification Goals** + + Ensure that AxLOCK && AxLEN <= 15 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F005_S000_I007 +* **Link to Coverage:** +* **Comments** + + *(none)* + +## Feature: Signals + +### Sub-feature: 000_ID + +#### Item: 000 + +* **Requirement location:** AXI Design doc - Transaction Identifiers +* **Feature Description** + + The CVA6 identify read transaction with an ID equal to 0 or 1 +* **Verification Goals** + + Ensure that ARID == 0b01 || ARID == 0b00 is always true while AR_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** AXI Design doc - Transaction Identifiers +* **Feature Description** + + The CVA6 identify write transaction with an ID equal to 1 +* **Verification Goals** + + Ensure that AWID == 0b01 is always true while AW_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S000_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 001_User + +#### Item: 000 + +* **Requirement location:** AXI Design doc - (table 2.2 and 2.5) +* **Feature Description** + + User-defined extension for the write and read address channel is not supported. AxUSER = 0b00 +* **Verification Goals** + + Ensure that AxUSER = 0b00 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S001_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** AXI Design doc - (table 2.4) +* **Feature Description** + + User-defined extension for the write response channel is not supported. +* **Verification Goals** + + Ensure that BUSER = 0b00 is always true while B_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S001_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 002_Quality_of_Service + +#### Item: 000 + +* **Requirement location:** AXI Design doc - (table 2.2 and 2.5) +* **Feature Description** + + Quality of Service identifier is not supported. AxQOS = 0b0000 +* **Verification Goals** + + Ensure that AxQOS = 0b0000 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S002_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 003_Cache + +#### Item: 000 + +* **Requirement location:** AXI Design Doc - Transaction Attributes: Memory types +* **Feature Description** + + AxCACHE always take 0b0000. +* **Verification Goals** + + Ensure that AxCACHE = 0b0000 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S003_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 004_Protection + +#### Item: 000 + +* **Requirement location:** AXI Design Doc - (Table 2.2 and 2.5) +* **Feature Description** + + Protection attributes always take the 0b000 +* **Verification Goals** + + Ensure that AxPROT = 0b000 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S004_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 008_Region + +#### Item: 000 + +* **Requirement location:** AXI Design doc - (table 2.2 and 2.5) +* **Feature Description** + + Region indicator is not supported. AxREGION = 0b0000 +* **Verification Goals** + + Ensure that AxREGION = 0b0000 is always true while AX_VALID is asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** Constrained Random +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F006_S008_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +## Feature: Clock and Reset + +### Sub-feature: 000_Signals_Value + +#### Item: 000 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.1.2) +* **Feature Description** + + A value of X on [Ax | x]VALID is not permitted when not in reset +* **Verification Goals** + + Ensure that reset && [Ax | x]VALID != X is always true +* **Pass/Fail Criteria:** Assertion +* **Test Type:** ENV Capability +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F007_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.1.2) +* **Feature Description** + + A value of X on [Ax | x]READY is not permitted when not in reset +* **Verification Goals** + + Ensure that reset && [Ax | x]READY != X is always true +* **Pass/Fail Criteria:** Assertion +* **Test Type:** ENV Capability +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F007_S000_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 002 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Figure A3-1) +* **Feature Description** + + [Ax | x]VALID is LOW for the first cycle after RESET goes HIGH +* **Verification Goals** + + Ensure that [Ax | x]VALID is low the first cycle after RESET +* **Pass/Fail Criteria:** Assertion +* **Test Type:** ENV Capability +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F007_S000_I002 +* **Link to Coverage:** +* **Comments** + + *(none)* + +## Feature: Handshake_Process + +### Sub-feature: 000_Stability + +#### Item: 000 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.2.2) +* **Feature Description** + + All signals must remain stable when [Ax | x]VALID is asserted and [Ax | x]READY is LOW +* **Verification Goals** + + Ensure that all the signals does not change while [Ax | x]VALID is asserted and [Ax | x]READY not yet asserted. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** ENV Capability +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F008_S000_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 001 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.2.1) +* **Feature Description** + + [Ax | x]VALID must remain asserted until [Ax | x]READY is HIGH +* **Verification Goals** + + Ensure that [Ax | x]VALID does not change while [Ax | x]READY is low. +* **Pass/Fail Criteria:** Assertion +* **Test Type:** ENV Capability +* **Coverage Method:** Assertion Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F008_S000_I001 +* **Link to Coverage:** +* **Comments** + + *(none)* + +### Sub-feature: 001_Timing + +#### Item: 000 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) +* **Feature Description** + + The Manager must not wait for the Subordinate to assert ARREADY before asserting ARVALID +* **Verification Goals** + + Ensure that no errors are encountered as the testbench injects random Ready-to-Valid delays. There are two cases to consider: + + ARREADY is asserted on or after same cycle as ARVALID + ARREADY is asserted and deasserted during an interval when ARVALID is de-asserted +* **Pass/Fail Criteria:** Any/All +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F008_S001_I000 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 002 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) +* **Feature Description** + + The Manager must not wait for the Subordinate to assert AWREADY before asserting AWVALID or WVALID. +* **Verification Goals** + + Ensure that no errors are encountered as the testbench injects random Ready-to-Valid delays. There are four cases to consider: + + AWREADY is asserted on or after same cycle as AWVALID and WVALID is de-asserted + AWREADY is asserted on or after same cycle as WVALID and AWVALID is de-asserted + AWREADY is asserted on or after same cycle as AWVALID and WVALID + AWREADY is asserted and deasserted during an interval when AWVALID and WVALID is de-asserted +* **Pass/Fail Criteria:** Any/All +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F008_S001_I002 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 003 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) +* **Feature Description** + + The Manager must not wait for the Subordinate to assert WREADY before asserting AWVALID or WVALID. +* **Verification Goals** + + Ensure that no errors are encountered as the testbench injects random Ready-to-Valid delays. There are four cases to consider: + + WREADY is asserted on or after same cycle as AWVALID and WVALID is de-asserted + WREADY is asserted on or after same cycle as WVALID and AWVALID is de-asserted + WREADY is asserted on or after same cycle as AWVALID and WVALID + WREADY is asserted and deasserted during an interval when AWVALID and WVALID is de-asserted +* **Pass/Fail Criteria:** Any/All +* **Test Type:** Constrained Random +* **Coverage Method:** Functional Coverage +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F008_S001_I003 +* **Link to Coverage:** +* **Comments** + + *(none)* + +#### Item: 005 + +* **Requirement location:** https://developer.arm.com/documentation/ihi0022/hc - (Section A3.3.1) +* **Feature Description** + + The Subordinate must not wait for the Manager to assert [B | R]READY before asserting [B | R]VALID +* **Verification Goals** + + No specific “observable checks†to be made in simulation. Testbench will always provide response data independently of [B | R]READY. +* **Pass/Fail Criteria:** Any/All +* **Test Type:** Other +* **Coverage Method:** N/A +* **Applicable Cores:** CV32A6_v0.1.0, CV32A6-step2, CV64A6-step3 +* **Unique verification tag:** VP_1_F008_S001_I005 +* **Link to Coverage:** +* **Comments** + + *(none)* + diff --git a/cva6/docs/VerifPlans/source/index.rst b/cva6/docs/VerifPlans/source/index.rst index 4ef40bc02..9d746186a 100644 --- a/cva6/docs/VerifPlans/source/index.rst +++ b/cva6/docs/VerifPlans/source/index.rst @@ -25,4 +25,5 @@ CV32A6-step1 Design Verification Plan dvplan_intro dvplan_FRONTEND dvplan_ISA + dvplan_AXI From 8fb057b666125a74f97949f9722a726e1081102b Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 7 Dec 2022 17:27:10 +0100 Subject: [PATCH 038/183] axi_agent: Add the Active mode agent and configure the agent to be able to act as active/passive agent Signed-off-by: Alae Eddine Ez zejjari --- .../uvma_axi/src/comps/uvma_axi_agent.sv | 64 ++++++ .../uvma_axi_ar_agent/uvma_axi_ar_agent.sv | 21 ++ .../uvma_axi_ar_agent/uvma_axi_ar_drv.sv | 81 +++++++ .../uvma_axi_ar_agent/uvma_axi_ar_mon.sv | 25 ++ .../uvma_axi_ar_agent/uvma_axi_ar_sqr.sv | 52 +++++ .../uvma_axi_aw_agent/uvma_axi_aw_agent.sv | 23 ++ .../uvma_axi_aw_agent/uvma_axi_aw_drv.sv | 95 ++++++++ .../uvma_axi_aw_agent/uvma_axi_aw_mon.sv | 28 +++ .../uvma_axi_aw_agent/uvma_axi_aw_sqr.sv | 56 +++++ .../uvma_axi_b_agent/uvma_axi_b_agent.sv | 23 +- .../comps/uvma_axi_b_agent/uvma_axi_b_drv.sv | 100 ++++++++ .../comps/uvma_axi_b_agent/uvma_axi_b_mon.sv | 22 ++ .../comps/uvma_axi_b_agent/uvma_axi_b_sqr.sv | 61 +++++ .../uvma_axi_r_agent/uvma_axi_r_agent.sv | 25 ++ .../comps/uvma_axi_r_agent/uvma_axi_r_drv.sv | 106 +++++++++ .../comps/uvma_axi_r_agent/uvma_axi_r_mon.sv | 25 +- .../comps/uvma_axi_r_agent/uvma_axi_r_sqr.sv | 58 +++++ .../uvma_axi/src/comps/uvma_axi_vseq.sv | 105 +++++++++ .../uvma_axi/src/comps/uvma_axi_vsqr.sv | 51 +++++ .../uvma_axi_w_agent/uvma_axi_w_agent.sv | 26 +++ .../comps/uvma_axi_w_agent/uvma_axi_w_drv.sv | 103 +++++++++ .../comps/uvma_axi_w_agent/uvma_axi_w_mon.sv | 22 ++ .../comps/uvma_axi_w_agent/uvma_axi_w_sqr.sv | 58 +++++ .../uvma_axi/src/obj/uvma_axi_cfg.sv | 39 ++++ .../uvma_axi/src/obj/uvma_axi_cntxt.sv | 4 + .../uvma_axi/src/seq/uvma_axi_ar_seq.sv | 54 +++++ .../uvma_axi/src/seq/uvma_axi_aw_seq.sv | 56 +++++ .../uvma_axi/src/seq/uvma_axi_b_seq.sv | 187 +++++++++++++++ .../src/seq/uvma_axi_fw_preload_seq.sv | 91 ++++++++ .../uvma_axi/src/seq/uvma_axi_r_seq.sv | 213 ++++++++++++++++++ .../uvma_axi/src/seq/uvma_axi_seq_lib.sv | 47 ++++ .../uvma_axi/src/seq/uvma_axi_w_seq.sv | 145 ++++++++++++ lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv | 19 ++ 33 files changed, 2083 insertions(+), 2 deletions(-) create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_sqr.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_sqr.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_drv.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_sqr.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_drv.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_sqr.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vseq.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vsqr.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_sqr.sv create mode 100644 lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_fw_preload_seq.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_seq_lib.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv index 6722f2424..b3652b533 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv @@ -22,7 +22,9 @@ class uvma_axi_agent_c extends uvm_agent; uvma_axi_b_agent_c b_agent; uvma_axi_ar_agent_c ar_agent; uvma_axi_r_agent_c r_agent; + uvma_axi_vsqr_c vsequencer; + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; function new(string name = "uvma_axi_agent_c", uvm_component parent = null); @@ -32,6 +34,7 @@ class uvma_axi_agent_c extends uvm_agent; function void build_phase(uvm_phase phase); super.build_phase(phase); + get_and_set_cfg (); get_and_set_cntxt(); retrieve_vif (); create_components(); @@ -49,6 +52,19 @@ class uvma_axi_agent_c extends uvm_agent; endfunction : get_and_set_cntxt + function void get_and_set_cfg(); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + else begin + `uvm_info("CFG", $sformatf("Found configuration handle:\n%s", cfg.sprint()), UVM_DEBUG) + uvm_config_db#(uvma_axi_cfg_c)::set(this, "*", "cfg", cfg); + end + + endfunction : get_and_set_cfg + function void retrieve_vif(); if (!uvm_config_db#(virtual uvma_axi_intf)::get(this, "", "axi_vif", cntxt.axi_vi)) begin @@ -67,9 +83,57 @@ class uvma_axi_agent_c extends uvm_agent; this.b_agent = uvma_axi_b_agent_c :: type_id :: create("b_agent", this); this.ar_agent = uvma_axi_ar_agent_c :: type_id :: create("ar_agent", this); this.r_agent = uvma_axi_r_agent_c :: type_id :: create("r_agent", this); + if( cfg.is_active == UVM_ACTIVE) begin + vsequencer = uvma_axi_vsqr_c::type_id::create("sequencer", this); + end endfunction : create_components + function void connect_phase(uvm_phase phase); + + //super.connect_phase(phase); + if( cfg.is_active == UVM_ACTIVE) begin + connect_mon_2_sqr(); + assemble_vsequencer(); + end else begin + `uvm_info(get_type_name(), $sformatf("PASSIVE MODE"), UVM_LOW) + end + + endfunction + + function void connect_mon_2_sqr(); + + this.aw_agent.monitor.uvma_aw_mon2drv_port.connect(aw_agent.sequencer.aw_req_export); + + this.w_agent.monitor.uvma_w_mon2drv_port.connect(w_agent.sequencer.w_req_export); + + this.aw_agent.monitor.uvma_aw_mon2drv_port.connect(w_agent.sequencer.aw_req_export.analysis_export); + + this.aw_agent.monitor.uvma_aw_mon_port.connect(b_agent.sequencer.aw_req_export.analysis_export); + + this.w_agent.monitor.uvma_w_mon_port.connect(b_agent.sequencer.w_req_export.analysis_export); + + this.b_agent.monitor.uvma_b_mon2drv_port.connect(b_agent.sequencer.b_resp_export); + + this.ar_agent.monitor.uvma_ar_mon2drv_port.connect(ar_agent.sequencer.ar_req_export); + + this.ar_agent.monitor.uvma_ar_mon_port.connect(r_agent.sequencer.ar_req_export.analysis_export); + + this.r_agent.monitor.uvma_r_mon_port.connect(r_agent.sequencer.r_resp_export); + + endfunction: connect_mon_2_sqr + + function void assemble_vsequencer(); + + vsequencer.aw_sequencer = aw_agent.sequencer; + vsequencer.ar_sequencer = ar_agent.sequencer; + vsequencer.w_sequencer = w_agent.sequencer; + vsequencer.b_sequencer = b_agent.sequencer; + vsequencer.r_sequencer = r_agent.sequencer; + + endfunction: assemble_vsequencer + + endclass : uvma_axi_agent_c `endif //__UVMA_AXI_AGENT_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv index 41b056864..dfda8bea0 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_agent.sv @@ -16,9 +16,14 @@ class uvma_axi_ar_agent_c extends uvm_agent; uvma_axi_ar_mon_c monitor; + uvma_axi_ar_sqr_c sequencer; + uvma_axi_ar_drv_c driver; + uvma_axi_cfg_c cfg; `uvm_component_utils_begin(uvma_axi_ar_agent_c) `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_field_object(sequencer, UVM_ALL_ON) + `uvm_field_object(driver, UVM_ALL_ON) `uvm_component_utils_end function new(string name = "uvma_axi_ar_agent_c", uvm_component parent = null); @@ -27,9 +32,25 @@ class uvma_axi_ar_agent_c extends uvm_agent; function void build_phase(uvm_phase phase); super.build_phase(phase); + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + if( cfg.is_active == UVM_ACTIVE) begin + this.sequencer = uvma_axi_ar_sqr_c::type_id::create("sequencer", this); + this.driver = uvma_axi_ar_drv_c::type_id::create("driver", this); + end this.monitor = uvma_axi_ar_mon_c::type_id::create("monitor", this); endfunction + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + //connect sequencer to driver + if( cfg.is_active == UVM_ACTIVE) begin + driver.seq_item_port.connect(sequencer.seq_item_export); + end + endfunction + endclass `endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv new file mode 100644 index 000000000..670843c40 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv @@ -0,0 +1,81 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave driver for AR channel ****/ + +`ifndef __UVMA_AXI_AR_DRV_SV__ +`define __UVMA_AXI_AR_DRV_SV__ + +class uvma_axi_ar_drv_c extends uvm_driver #(uvma_axi_ar_item_c); + + `uvm_component_utils(uvma_axi_ar_drv_c) + + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + uvma_axi_ar_item_c ar_item; + // Handles to virtual interface modport + virtual uvma_axi_intf.slave slave_mp; + + function new(string name = "uvma_axi_ar_drv_c", uvm_component parent); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + + if(!uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)) begin + `uvm_fatal("build_phase", "driver reset cntxt class failed") + end + this.slave_mp = this.cntxt.axi_vi.slave; + ar_item = uvma_axi_ar_item_c::type_id::create("ar_item", this); + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + endfunction + + task run_phase(uvm_phase phase); + super.run_phase(phase); + forever begin + case (cntxt.reset_state) + UVMA_AXI_RESET_STATE_PRE_RESET : drv_pre_reset (); + UVMA_AXI_RESET_STATE_IN_RESET : drv_in_reset (); + UVMA_AXI_RESET_STATE_POST_RESET: drv_post_reset(); + + default: `uvm_fatal("AXI_AR_DRV", $sformatf("Invalid reset_state: %0d", cntxt.reset_state)) + endcase + end + endtask: run_phase + + task drv_pre_reset(); + + this.slave_mp.slv_axi_cb.ar_ready <= 0; + @(slave_mp.slv_axi_cb); + + endtask: drv_pre_reset + + task drv_in_reset(); + + this.slave_mp.slv_axi_cb.ar_ready <= 0; + @(slave_mp.slv_axi_cb); + + endtask: drv_in_reset + + task drv_post_reset(); + seq_item_port.get_next_item(ar_item); + this.slave_mp.slv_axi_cb.ar_ready <= 1'b1; + `uvm_info(get_type_name(), $sformatf("read address, response by ar_ready"), UVM_LOW) + @(slave_mp.slv_axi_cb); + seq_item_port.item_done(); + endtask: drv_post_reset + +endclass: uvma_axi_ar_drv_c + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv index 42af17013..f9d81b746 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv @@ -17,15 +17,20 @@ class uvma_axi_ar_mon_c extends uvm_monitor; `uvm_component_utils(uvma_axi_ar_mon_c) uvma_axi_ar_item_c ar_item; + uvma_axi_ar_item_c ardrv_item; uvm_analysis_port#(uvma_axi_ar_item_c) uvma_ar_mon_port; + uvm_analysis_port#(uvma_axi_ar_item_c) uvma_ar_mon2drv_port; + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; + virtual uvma_axi_intf vif; function new(string name = "uvma_axi_ar_mon_c", uvm_component parent); super.new(name, parent); this.uvma_ar_mon_port = new("uvma_ar_mon_port", this); + this.uvma_ar_mon2drv_port = new("uvma_ar_mon2drv_port", this); endfunction function void build_phase(uvm_phase phase); @@ -37,8 +42,15 @@ class uvma_axi_ar_mon_c extends uvm_monitor; end passive_mp = cntxt.axi_vi.passive; + vif = cntxt.axi_vi; ar_item = uvma_axi_ar_item_c::type_id::create("ar_item", this); + ardrv_item = uvma_axi_ar_item_c::type_id::create("ardrv_item", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end endfunction @@ -78,6 +90,19 @@ class uvma_axi_ar_mon_c extends uvm_monitor; this.ar_item.ar_lock = 0; end end + if(cfg.is_active) begin + // collect AR signals + this.ardrv_item.ar_id = vif.ar_id; + this.ardrv_item.ar_addr = vif.ar_addr; + this.ardrv_item.ar_len = vif.ar_len; + this.ardrv_item.ar_size = vif.ar_size; + this.ardrv_item.ar_burst = vif.ar_burst; + this.ardrv_item.ar_user = vif.ar_user; + this.ardrv_item.ar_valid = vif.ar_valid; + this.ardrv_item.ar_ready = vif.ar_ready; + this.ardrv_item.ar_lock = vif.ar_lock; + this.uvma_ar_mon2drv_port.write(this.ardrv_item); + end this.uvma_ar_mon_port.write(this.ar_item); @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_sqr.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_sqr.sv new file mode 100644 index 000000000..4da5386e0 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_sqr.sv @@ -0,0 +1,52 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +/**** AXI4 master sequencer ****/ + +`ifndef __UVMA_AXI_AR_SQR_SV__ +`define __UVMA_AXI_AR_SQR_SV__ + +class uvma_axi_ar_sqr_c extends uvm_sequencer#(uvma_axi_ar_item_c); + + `uvm_component_utils(uvma_axi_ar_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvm_analysis_export #(uvma_axi_ar_item_c) ar_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_ar_item_c) ar_req_fifo; + + function new(string name = "uvma_axi_ar_sqr_c", uvm_component parent = null); + super.new(name, parent); + this.ar_req_export = new("ar_req_export", this); + this.ar_req_fifo = new("ar_req_fifo", this); + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("CNTXT", "Context handle is null") + end + endfunction + + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + this.ar_req_export.connect(this.ar_req_fifo.analysis_export); // Connect analysis export direct to fifo ar channels + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv index a7a904d04..7a4c2410d 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_agent.sv @@ -16,9 +16,14 @@ class uvma_axi_aw_agent_c extends uvm_agent; uvma_axi_aw_mon_c monitor; + uvma_axi_aw_sqr_c sequencer; + uvma_axi_aw_drv_c driver; + uvma_axi_cfg_c cfg; `uvm_component_utils_begin(uvma_axi_aw_agent_c) `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_field_object(sequencer, UVM_ALL_ON) + `uvm_field_object(driver, UVM_ALL_ON) `uvm_component_utils_end function new(string name = "uvma_axi_aw_agent_c", uvm_component parent = null); @@ -28,10 +33,28 @@ class uvma_axi_aw_agent_c extends uvm_agent; function void build_phase(uvm_phase phase); super.build_phase(phase); + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + if( cfg.is_active == UVM_ACTIVE) begin + this.sequencer = uvma_axi_aw_sqr_c::type_id::create("sequencer", this); + this.driver = uvma_axi_aw_drv_c::type_id::create("driver", this); + end this.monitor = uvma_axi_aw_mon_c::type_id::create("monitor", this); endfunction + function void connect_phase(uvm_phase phase); + + super.connect_phase(phase); + //connect sequencer to driver + if( cfg.is_active == UVM_ACTIVE) begin + driver.seq_item_port.connect(sequencer.seq_item_export); + end + + endfunction + endclass `endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv new file mode 100644 index 000000000..515959530 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv @@ -0,0 +1,95 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave AW driver ****/ + +`ifndef __UVMA_AXI_AW_DRV_SV__ +`define __UVMA_AXI_AW_DRV_SV__ + +class uvma_axi_aw_drv_c extends uvm_driver #(uvma_axi_aw_item_c); + + `uvm_component_utils(uvma_axi_aw_drv_c) + + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_aw_item_c aw_item; + + // Handles to virtual interface modport + virtual uvma_axi_intf.slave slave_mp; + + extern function new(string name = "uvma_axi_aw_drv_c", uvm_component parent); + extern virtual function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + extern task drv_pre_reset(); + extern task drv_in_reset(); + extern task drv_post_reset(); + +endclass: uvma_axi_aw_drv_c + +function uvma_axi_aw_drv_c::new(string name = "uvma_axi_aw_drv_c", uvm_component parent); + super.new(name, parent); +endfunction + +function void uvma_axi_aw_drv_c::build_phase(uvm_phase phase); + super.build_phase(phase); + if(!uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)) begin + `uvm_fatal("build_phase", "driver reset cntxt class failed") + end + this.slave_mp = this.cntxt.axi_vi.slave; + aw_item = uvma_axi_aw_item_c::type_id::create("aw_item", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end +endfunction + +task uvma_axi_aw_drv_c::run_phase(uvm_phase phase); + super.run_phase(phase); + forever begin + case (cntxt.reset_state) + UVMA_AXI_RESET_STATE_PRE_RESET : drv_pre_reset (); + UVMA_AXI_RESET_STATE_IN_RESET : drv_in_reset (); + UVMA_AXI_RESET_STATE_POST_RESET : drv_post_reset(); + + default: `uvm_fatal("AXI_Aw_DRV", $sformatf("Invalid reset_state: %0d", cntxt.reset_state)) + endcase + end +endtask: run_phase + +task uvma_axi_aw_drv_c::drv_pre_reset(); + + this.slave_mp.slv_axi_cb.aw_ready <= 0; + @(slave_mp.slv_axi_cb); + +endtask: drv_pre_reset + +task uvma_axi_aw_drv_c::drv_in_reset(); + + this.slave_mp.slv_axi_cb.aw_ready <= 0; + @(slave_mp.slv_axi_cb); + +endtask: drv_in_reset + +task uvma_axi_aw_drv_c::drv_post_reset(); + + `uvm_info(get_type_name(), $sformatf("write address driver start"), UVM_LOW) + seq_item_port.get_next_item(aw_item); + + this.slave_mp.slv_axi_cb.aw_ready <= 1'b1; + @(slave_mp.slv_axi_cb); + + seq_item_port.item_done(); + +endtask: drv_post_reset + +`endif + diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv index eaef23da1..e861b4b34 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv @@ -16,18 +16,23 @@ class uvma_axi_aw_mon_c extends uvm_monitor; `uvm_component_utils(uvma_axi_aw_mon_c) + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; uvma_axi_aw_item_c aw_item; + uvma_axi_aw_item_c awdrv_item; uvm_analysis_port #(uvma_axi_aw_item_c) uvma_aw_mon_port; + uvm_analysis_port #(uvma_axi_aw_item_c) uvma_aw_mon2drv_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; + virtual uvma_axi_intf vif; function new(string name = "uvma_axi_aw_mon_c", uvm_component parent); super.new(name, parent); this.uvma_aw_mon_port = new("uvma_aw_mon_port", this); + this.uvma_aw_mon2drv_port = new("uvma_aw_mon2drv_port", this); endfunction function void build_phase(uvm_phase phase); @@ -40,8 +45,15 @@ class uvma_axi_aw_mon_c extends uvm_monitor; end passive_mp = cntxt.axi_vi.passive; + vif = cntxt.axi_vi; this.aw_item = uvma_axi_aw_item_c::type_id::create("aw_item", this); + this.awdrv_item = uvma_axi_aw_item_c::type_id::create("awdrv_item", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end endfunction @@ -89,6 +101,22 @@ class uvma_axi_aw_mon_c extends uvm_monitor; this.aw_item.aw_atop = 0; end end + + if(cfg.is_active) begin + // collect AR signals + this.awdrv_item.aw_id = vif.aw_id; + this.awdrv_item.aw_addr = vif.aw_addr; + this.awdrv_item.aw_len = vif.aw_len; + this.awdrv_item.aw_size = vif.aw_size; + this.awdrv_item.aw_burst = vif.aw_burst; + this.awdrv_item.aw_user = vif.aw_user; + this.awdrv_item.aw_valid = vif.aw_valid; + this.awdrv_item.aw_ready = vif.aw_ready; + this.awdrv_item.aw_lock = vif.aw_lock; + this.awdrv_item.aw_atop = vif.aw_atop; + this.uvma_aw_mon2drv_port.write(this.awdrv_item); + end + this.uvma_aw_mon_port.write(this.aw_item); @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_sqr.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_sqr.sv new file mode 100644 index 000000000..304c0aca3 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_sqr.sv @@ -0,0 +1,56 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +/**** AXI4 master sequencer ****/ + +`ifndef __UVMA_AXI_AW_SQR_SV__ +`define __UVMA_AXI_AW_SQR_SV__ + +class uvma_axi_aw_sqr_c extends uvm_sequencer#(uvma_axi_aw_item_c); + + `uvm_component_utils(uvma_axi_aw_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvm_analysis_export #(uvma_axi_aw_item_c) aw_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_aw_item_c) aw_req_fifo; + + function new(string name = "uvma_axi_aw_sqr_c", uvm_component parent = null); + + super.new(name, parent); + + this.aw_req_export = new("aw_req_export", this); + this.aw_req_fifo = new("aw_req_fifo", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("CNTXT", "Context handle is null") + end + + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + endfunction + + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + this.aw_req_export.connect(this.aw_req_fifo.analysis_export); // Connect analysis export direct to fifo aw channels + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv index 3dde7702f..2e782a693 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_agent.sv @@ -16,9 +16,14 @@ class uvma_axi_b_agent_c extends uvm_agent; uvma_axi_b_mon_c monitor; + uvma_axi_b_sqr_c sequencer; + uvma_axi_b_drv_c driver; + uvma_axi_cfg_c cfg; `uvm_component_utils_begin(uvma_axi_b_agent_c) `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_field_object(sequencer, UVM_ALL_ON) + `uvm_field_object(driver, UVM_ALL_ON) `uvm_component_utils_end function new(string name = "uvma_axi_b_agent_c", uvm_component parent = null); @@ -26,13 +31,29 @@ class uvma_axi_b_agent_c extends uvm_agent; endfunction function void build_phase(uvm_phase phase); - super.build_phase(phase); + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + if( cfg.is_active == UVM_ACTIVE) begin + this.sequencer = uvma_axi_b_sqr_c::type_id::create("sequencer", this); + this.driver = uvma_axi_b_drv_c::type_id::create("driver", this); + end this.monitor = uvma_axi_b_mon_c::type_id::create("monitor", this); endfunction + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + //connect sequencer to driver + if( cfg.is_active == UVM_ACTIVE) begin + driver.seq_item_port.connect(sequencer.seq_item_export); + end + endfunction + endclass : uvma_axi_b_agent_c `endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_drv.sv new file mode 100644 index 000000000..dc2246723 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_drv.sv @@ -0,0 +1,100 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave B channel driver ****/ + +`ifndef __UVMA_AXI_B_DRV_SV__ +`define __UVMA_AXI_B_DRV_SV__ + +class uvma_axi_b_drv_c extends uvm_driver #(uvma_axi_b_item_c); + + `uvm_component_utils(uvma_axi_b_drv_c) + + uvma_axi_cntxt_c cntxt; + + uvma_axi_b_item_c b_item; + + //Handles to virtual interface modport + virtual uvma_axi_intf.slave slave_mp; + + function new(string name = "uvma_axi_b_drv_c", uvm_component parent); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + + super.build_phase(phase); + + if(!uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", this.cntxt)) begin + `uvm_fatal("build_phase", "driver cntxt class failed") + end + + this.slave_mp = this.cntxt.axi_vi.slave; + b_item = uvma_axi_b_item_c::type_id::create("b_item", this); + + endfunction + + task run_phase(uvm_phase phase); + + super.run_phase(phase); + forever begin + case (cntxt.reset_state) + UVMA_AXI_RESET_STATE_PRE_RESET : drv_pre_reset (); + UVMA_AXI_RESET_STATE_IN_RESET : drv_in_reset (); + UVMA_AXI_RESET_STATE_POST_RESET : drv_post_reset(); + + default: `uvm_fatal("AXI_AR_DRV", $sformatf("Invalid reset_state: %0d", cntxt.reset_state)) + endcase + end + + endtask: run_phase + + task drv_pre_reset(); + + this.slave_mp.slv_axi_cb.b_id <= 0; + this.slave_mp.slv_axi_cb.b_resp <= 0; + this.slave_mp.slv_axi_cb.b_user <= 0; + this.slave_mp.slv_axi_cb.b_valid <= 0; + this.slave_mp.slv_axi_cb.b_user <= 0; + @(slave_mp.slv_axi_cb); + + endtask: drv_pre_reset + + task drv_in_reset(); + + this.slave_mp.slv_axi_cb.b_id <= 0; + this.slave_mp.slv_axi_cb.b_resp <= 0; + this.slave_mp.slv_axi_cb.b_user <= 0; + this.slave_mp.slv_axi_cb.b_valid <= 0; + this.slave_mp.slv_axi_cb.b_user <= 0; + @(slave_mp.slv_axi_cb); + + endtask: drv_in_reset + + task drv_post_reset(); + + seq_item_port.get_next_item(b_item); + + `uvm_info(get_type_name(),$sformatf("response, send resp to DUT"), UVM_LOW) + + this.slave_mp.slv_axi_cb.b_id <= this.b_item.b_id; + this.slave_mp.slv_axi_cb.b_resp <= this.b_item.b_resp; + this.slave_mp.slv_axi_cb.b_user <= this.b_item.b_user; + this.slave_mp.slv_axi_cb.b_user <= this.b_item.b_user; + this.slave_mp.slv_axi_cb.b_valid <= this.b_item.b_valid; + @(slave_mp.slv_axi_cb); + + seq_item_port.item_done(); + + endtask: drv_post_reset + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv index 12062c6e3..97b0212e6 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv @@ -17,14 +17,18 @@ class uvma_axi_b_mon_c extends uvm_monitor; `uvm_component_utils(uvma_axi_b_mon_c) + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; uvma_axi_b_item_c b_item; + uvma_axi_b_item_c bdrv_item; uvm_analysis_port #(uvma_axi_b_item_c) uvma_b_mon_port; + uvm_analysis_port #(uvma_axi_b_item_c) uvma_b_mon2drv_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; + virtual uvma_axi_intf vif; extern function new(string name = "uvma_axi_b_mon_c", uvm_component parent); extern virtual function void build_phase(uvm_phase phase); @@ -35,6 +39,7 @@ endclass:uvma_axi_b_mon_c function uvma_axi_b_mon_c::new(string name = "uvma_axi_b_mon_c", uvm_component parent); super.new(name, parent); this.uvma_b_mon_port = new("uvma_b_mon_port", this); + this.uvma_b_mon2drv_port = new("uvma_b_mon2drv_port", this); endfunction function void uvma_axi_b_mon_c::build_phase(uvm_phase phase); @@ -46,9 +51,16 @@ function void uvma_axi_b_mon_c::build_phase(uvm_phase phase); `uvm_fatal("build_phase", "monitor cntxt class failed") end + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + passive_mp = cntxt.axi_vi.passive; + vif = cntxt.axi_vi; this.b_item = uvma_axi_b_item_c::type_id::create("b_item", this); + this.bdrv_item = uvma_axi_b_item_c::type_id::create("bdrv_item", this); endfunction:build_phase @@ -69,6 +81,16 @@ task uvma_axi_b_mon_c::monitor_b_items(); this.b_item.b_valid = passive_mp.psv_axi_cb.b_valid; this.b_item.b_ready = passive_mp.psv_axi_cb.b_ready; this.uvma_b_mon_port.write(b_item); + + if(cfg.is_active) begin + // collect b signals + this.bdrv_item.b_id = vif.b_id; + this.bdrv_item.b_resp = vif.b_resp; + this.bdrv_item.b_user = vif.b_user; + this.bdrv_item.b_valid = vif.b_valid; + this.bdrv_item.b_ready = vif.b_ready; + this.uvma_b_mon2drv_port.write(this.bdrv_item); + end @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_sqr.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_sqr.sv new file mode 100644 index 000000000..ef10e7037 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_sqr.sv @@ -0,0 +1,61 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave sequencer ****/ + +`ifndef __UVMA_AXI_B_SQR_SV__ +`define __UVMA_AXI_B_SQR_SV__ + +class uvma_axi_b_sqr_c extends uvm_sequencer#(uvma_axi_b_item_c); + + `uvm_component_utils(uvma_axi_b_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvm_analysis_export #(uvma_axi_b_item_c) b_resp_export; + uvm_tlm_analysis_fifo #(uvma_axi_aw_item_c) aw_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_w_item_c) w_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_b_item_c) b_resp_fifo; + + function new(string name = "uvma_axi_b_sqr_c", uvm_component parent = null); + + super.new(name, parent); + + this.b_resp_export = new("b_resp_export", this); + this.aw_req_export = new("aw_req_export", this); + this.w_req_export = new("w_req_export", this); + this.b_resp_fifo = new("b_resp_fifo", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("CNTXT", "Context handle is null") + end + + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + endfunction + + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + this.b_resp_export.connect(this.b_resp_fifo.analysis_export); // Connect analysis export direct to fifo B channels + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv index e0651e5d9..e904d317f 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_agent.sv @@ -16,9 +16,14 @@ class uvma_axi_r_agent_c extends uvm_agent; uvma_axi_r_mon_c monitor; + uvma_axi_r_sqr_c sequencer; + uvma_axi_r_drv_c driver; + uvma_axi_cfg_c cfg; `uvm_component_utils_begin(uvma_axi_r_agent_c) `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_field_object(sequencer, UVM_ALL_ON) + `uvm_field_object(driver, UVM_ALL_ON) `uvm_component_utils_end function new(string name = "uvma_axi_r_agent_c", uvm_component parent = null); @@ -28,10 +33,30 @@ class uvma_axi_r_agent_c extends uvm_agent; function void build_phase(uvm_phase phase); super.build_phase(phase); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + if( cfg.is_active == UVM_ACTIVE) begin + sequencer = uvma_axi_r_sqr_c::type_id::create("sequencer", this); + driver = uvma_axi_r_drv_c::type_id::create("driver", this); + end monitor = uvma_axi_r_mon_c::type_id::create("monitor", this); endfunction + function void connect_phase(uvm_phase phase); + + super.connect_phase(phase); + //connect sequencer to driver + if( cfg.is_active == UVM_ACTIVE) begin + this.driver.seq_item_port.connect(this.sequencer.seq_item_export); + end + + endfunction + endclass : uvma_axi_r_agent_c `endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_drv.sv new file mode 100644 index 000000000..e08c79f7c --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_drv.sv @@ -0,0 +1,106 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave driver for read ****/ + +`ifndef __UVMA_AXI_R_DRV_SV__ +`define __UVMA_AXI_R_DRV_SV__ + +class uvma_axi_r_drv_c extends uvm_driver #(uvma_axi_r_item_c); + + `uvm_component_utils(uvma_axi_r_drv_c) + + uvma_axi_cntxt_c cntxt; + + uvma_axi_r_item_c r_item; + + // Handles to virtual interface modport + virtual uvma_axi_intf.slave slave_mp; + + extern function new(string name = "uvma_axi_r_drv_c", uvm_component parent); + extern virtual function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + extern task drv_pre_reset(); + extern task drv_in_reset(); + extern task drv_post_reset(); + +endclass: uvma_axi_r_drv_c + +function uvma_axi_r_drv_c::new(string name = "uvma_axi_r_drv_c", uvm_component parent); + super.new(name, parent); +endfunction + +function void uvma_axi_r_drv_c::build_phase(uvm_phase phase); + + super.build_phase(phase); + if(!uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)) begin + `uvm_fatal("build_phase", "driver cntxt class failed") + end + // uvm_config_db#(uvma_axi_cntxt_c)::set(this, "*", "cntxt", cntxt); + this.slave_mp = this.cntxt.axi_vi.slave; + r_item = uvma_axi_r_item_c::type_id::create("r_item"); + +endfunction + +task uvma_axi_r_drv_c::run_phase(uvm_phase phase); + + super.run_phase(phase); + forever begin + case (cntxt.reset_state) + UVMA_AXI_RESET_STATE_PRE_RESET : drv_pre_reset (); + UVMA_AXI_RESET_STATE_IN_RESET : drv_in_reset (); + UVMA_AXI_RESET_STATE_POST_RESET : drv_post_reset(); + + default: `uvm_fatal("AXI_AR_DRV", $sformatf("Invalid reset_state: %0d", cntxt.reset_state)) + endcase + end + +endtask: run_phase + +task uvma_axi_r_drv_c::drv_pre_reset(); + + this.slave_mp.slv_axi_cb.r_id <= 0; + this.slave_mp.slv_axi_cb.r_resp <= 0; + this.slave_mp.slv_axi_cb.r_user <= 0; + this.slave_mp.slv_axi_cb.r_valid <= 0; + this.slave_mp.slv_axi_cb.r_user <= 0; + @(slave_mp.slv_axi_cb); + +endtask: drv_pre_reset + +task uvma_axi_r_drv_c::drv_in_reset(); + + this.slave_mp.slv_axi_cb.r_id <= 0; + this.slave_mp.slv_axi_cb.r_resp <= 0; + this.slave_mp.slv_axi_cb.r_user <= 0; + this.slave_mp.slv_axi_cb.r_valid <= 0; + this.slave_mp.slv_axi_cb.r_user <= 0; + @(slave_mp.slv_axi_cb); + +endtask: drv_in_reset + +task uvma_axi_r_drv_c::drv_post_reset(); + + seq_item_port.get_next_item(r_item); + + `uvm_info(get_type_name(),$sformatf("response, send data to DUT"), UVM_LOW) + this.slave_mp.slv_axi_cb.r_id <= this.r_item.r_id; + this.slave_mp.slv_axi_cb.r_resp <= this.r_item.r_resp; + this.slave_mp.slv_axi_cb.r_user <= this.r_item.r_user; + this.slave_mp.slv_axi_cb.r_last <= this.r_item.r_last; + this.slave_mp.slv_axi_cb.r_valid <= this.r_item.r_valid; + this.slave_mp.slv_axi_cb.r_data <= this.r_item.r_data; + @(slave_mp.slv_axi_cb); + + seq_item_port.item_done(); + +endtask: drv_post_reset + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv index 4d14c2766..14a4ae81e 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv @@ -17,14 +17,18 @@ class uvma_axi_r_mon_c extends uvm_monitor; `uvm_component_utils(uvma_axi_r_mon_c) + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; uvma_axi_r_item_c r_item; + uvma_axi_r_item_c rdrv_item; uvm_analysis_port #(uvma_axi_r_item_c) uvma_r_mon_port; + uvm_analysis_port #(uvma_axi_r_item_c) uvma_r_mon2drv_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; + virtual uvma_axi_intf vif; extern function new(string name = "uvma_axi_r_mon_c", uvm_component parent); extern virtual function void build_phase(uvm_phase phase); @@ -38,6 +42,7 @@ function uvma_axi_r_mon_c::new(string name = "uvma_axi_r_mon_c", uvm_component p super.new(name, parent); uvma_r_mon_port = new("uvma_r_mon_port", this); + uvma_r_mon2drv_port = new("uvma_r_mon2drv_port", this); endfunction @@ -49,9 +54,16 @@ function void uvma_axi_r_mon_c::build_phase(uvm_phase phase); `uvm_fatal("build_phase", "monitor cntxt class failed") end + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + passive_mp = cntxt.axi_vi.passive; + vif = cntxt.axi_vi; this.r_item = uvma_axi_r_item_c::type_id::create("r_item", this); + this.rdrv_item = uvma_axi_r_item_c::type_id::create("rdrv_item", this); endfunction @@ -79,6 +91,18 @@ task uvma_axi_r_mon_c::monitor_r_items(); this.r_item.r_ready = passive_mp.psv_axi_cb.r_ready; this.uvma_r_mon_port.write(r_item); + + if(cfg.is_active) begin + // collect AR signals + this.rdrv_item.r_id = vif.r_id; + this.rdrv_item.r_data = vif.r_data; + this.rdrv_item.r_resp = vif.r_resp; + this.rdrv_item.r_last = vif.r_last; + this.rdrv_item.r_user = vif.r_user; + this.rdrv_item.r_valid = vif.r_valid; + this.rdrv_item.r_ready = vif.r_ready; + this.uvma_r_mon2drv_port.write(this.rdrv_item); + end @(passive_mp.psv_axi_cb); end @@ -95,7 +119,6 @@ task uvma_axi_r_mon_c::observe_reset(); wait (cntxt.axi_vi.rst_n === 1); cntxt.reset_state = UVMA_AXI_RESET_STATE_POST_RESET; `uvm_info(get_type_name(), $sformatf("RESET_STATE_POST_RESET"), UVM_LOW) - end endtask : observe_reset diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_sqr.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_sqr.sv new file mode 100644 index 000000000..4ae686804 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_sqr.sv @@ -0,0 +1,58 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave sequencer for R channel ****/ + +`ifndef __UVMA_AXI_R_SQR_SV__ +`define __UVMA_AXI_R_SQR_SV__ + +class uvma_axi_r_sqr_c extends uvm_sequencer#(uvma_axi_r_item_c); + + `uvm_component_utils(uvma_axi_r_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvm_analysis_export #(uvma_axi_r_item_c) r_resp_export; + uvm_tlm_analysis_fifo #(uvma_axi_ar_item_c) ar_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_r_item_c) r_resp_fifo; + + function new(string name = "uvma_axi_r_sqr_c", uvm_component parent = null); + super.new(name, parent); + r_resp_export = new("r_resp_export", this); + ar_req_export = new("ar_req_export", this); + r_resp_fifo = new("r_resp_fifo", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("CNTXT", "Context handle is null") + end + + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + endfunction + + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + // Connect analysis export direct to fifo AR Channel + this.r_resp_export.connect(this.r_resp_fifo.analysis_export); + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vseq.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vseq.sv new file mode 100644 index 000000000..1f3850bb4 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vseq.sv @@ -0,0 +1,105 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + + +`ifndef __UVMA_AXI_VSEQ_SV__ +`define __UVMA_AXI_VSEQ_SV__ + +class uvma_axi_vseq_c extends uvm_sequence; + + // Environment handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + + `uvm_object_utils(uvma_axi_vseq_c) + `uvm_declare_p_sequencer(uvma_axi_vsqr_c) + + + /** + * Default constructor. + */ + extern function new(string name="uvma_axi_vseq"); + + /** + * Retrieve cfg and cntxt handles from p_sequencer. + */ + extern virtual task pre_start(); + + + extern virtual task body(); + +endclass : uvma_axi_vseq_c + + +function uvma_axi_vseq_c::new(string name="uvma_axi_vseq"); + + super.new(name); + +endfunction : new + + +task uvma_axi_vseq_c::pre_start(); + + cfg = p_sequencer.cfg ; + cntxt = p_sequencer.cntxt; + +endtask : pre_start + +task uvma_axi_vseq_c::body(); + + uvma_axi_fw_preload_seq_c axi_preload_seq; + axi_preload_seq = uvma_axi_fw_preload_seq_c::type_id::create("axi_preload_seq"); + axi_preload_seq.start(p_sequencer.r_sequencer); + fork + begin + if(cfg.is_active == UVM_ACTIVE) begin + uvma_axi_aw_seq_c aw_axi_seq; + aw_axi_seq = uvma_axi_aw_seq_c::type_id::create("aw_axi_seq"); + aw_axi_seq.start(p_sequencer.aw_sequencer); + end + end + + begin + if(cfg.is_active == UVM_ACTIVE) begin + uvma_axi_w_seq_c w_axi_seq; + w_axi_seq = uvma_axi_w_seq_c::type_id::create("w_axi_seq"); + w_axi_seq.start(p_sequencer.w_sequencer); + end + end + + begin + if(cfg.is_active == UVM_ACTIVE) begin + uvma_axi_ar_seq_c ar_axi_seq; + ar_axi_seq = uvma_axi_ar_seq_c::type_id::create("ar_axi_seq"); + ar_axi_seq.start(p_sequencer.ar_sequencer); + end + end + + begin + if(cfg.is_active == UVM_ACTIVE) begin + uvma_axi_r_seq_c r_axi_seq; + r_axi_seq = uvma_axi_r_seq_c::type_id::create("r_axi_seq"); + r_axi_seq.start(p_sequencer.r_sequencer); + end + end + + begin + if(cfg.is_active == UVM_ACTIVE) begin + uvma_axi_b_seq_c b_axi_seq; + b_axi_seq = uvma_axi_b_seq_c::type_id::create("b_axi_seq"); + b_axi_seq.start(p_sequencer.b_sequencer); + end + end + join_none + +endtask : body + +`endif // __uvma_axi_vseq_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vsqr.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vsqr.sv new file mode 100644 index 000000000..4f76b168e --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_vsqr.sv @@ -0,0 +1,51 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave sequencer ****/ + +`ifndef __UVMA_AXI_SQR_SV__ +`define __UVMA_AXI_SQR_SV__ + +class uvma_axi_vsqr_c extends uvm_sequencer; + + `uvm_component_utils(uvma_axi_vsqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_aw_sqr_c aw_sequencer; + uvma_axi_ar_sqr_c ar_sequencer; + uvma_axi_w_sqr_c w_sequencer; + uvma_axi_b_sqr_c b_sequencer; + uvma_axi_r_sqr_c r_sequencer; + + function new(string name = "uvma_axi_vsqr_c", uvm_component parent = null); + super.new(name, parent); + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("CNTXT", "Context handle is null") + end + endfunction + +endclass + +`endif + diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv index 9ba854017..aac481dfb 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_agent.sv @@ -16,9 +16,14 @@ class uvma_axi_w_agent_c extends uvm_agent; uvma_axi_w_mon_c monitor; + uvma_axi_w_sqr_c sequencer; + uvma_axi_w_drv_c driver; + uvma_axi_cfg_c cfg; `uvm_component_utils_begin(uvma_axi_w_agent_c) `uvm_field_object(monitor, UVM_ALL_ON) + `uvm_field_object(sequencer, UVM_ALL_ON) + `uvm_field_object(driver, UVM_ALL_ON) `uvm_component_utils_end function new(string name = "uvma_axi_w_agent_c", uvm_component parent = null); @@ -27,11 +32,32 @@ class uvma_axi_w_agent_c extends uvm_agent; function void build_phase(uvm_phase phase); + `uvm_info(get_type_name(), $sformatf("write address, 1"), UVM_HIGH) super.build_phase(phase); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + if( cfg.is_active == UVM_ACTIVE) begin + this.sequencer = uvma_axi_w_sqr_c::type_id::create("sequencer", this); + this.driver = uvma_axi_w_drv_c::type_id::create("driver", this); + end this.monitor = uvma_axi_w_mon_c::type_id::create("monitor", this); endfunction + function void connect_phase(uvm_phase phase); + + super.connect_phase(phase); + //connect sequencer to driver + if( cfg.is_active == UVM_ACTIVE) begin + driver.seq_item_port.connect(sequencer.seq_item_export); + end + + endfunction + endclass `endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv new file mode 100644 index 000000000..1b205d39d --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv @@ -0,0 +1,103 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +/**** AXI4 slave W channel driver ****/ + +`ifndef __UVMA_AXI_W_DRV_SV__ +`define __UVMA_AXI_W_DRV_SV__ + +class uvma_axi_w_drv_c extends uvm_driver #(uvma_axi_w_item_c); + + `uvm_component_utils(uvma_axi_w_drv_c) + + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_w_item_c w_item; + + // Handles to virtual interface modport + virtual uvma_axi_intf.slave slave_mp; + + extern function new(string name = "uvma_axi_w_drv_c", uvm_component parent); + extern virtual function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + extern task drv_pre_reset(); + extern task drv_in_reset(); + extern task drv_post_reset(); + +endclass:uvma_axi_w_drv_c + +function uvma_axi_w_drv_c::new(string name = "uvma_axi_w_drv_c", uvm_component parent); + super.new(name, parent); +endfunction + +function void uvma_axi_w_drv_c::build_phase(uvm_phase phase); + + super.build_phase(phase); + + if(!uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)) begin + `uvm_fatal("build_phase", "w_driver cntxt class failed") + end + + this.slave_mp = this.cntxt.axi_vi.slave; + + w_item = uvma_axi_w_item_c::type_id::create("w_item", this); + + // get cfg handle to driver + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + +endfunction + +task uvma_axi_w_drv_c::run_phase(uvm_phase phase); + + super.run_phase(phase); + + forever begin + + case (cntxt.reset_state) + UVMA_AXI_RESET_STATE_PRE_RESET : drv_pre_reset (); + UVMA_AXI_RESET_STATE_IN_RESET : drv_in_reset (); + UVMA_AXI_RESET_STATE_POST_RESET : drv_post_reset(); + + default: `uvm_fatal("AXI_w_DRV", $sformatf("Invalid reset_state: %0d", cntxt.reset_state)) + endcase + + end + +endtask: run_phase + +task uvma_axi_w_drv_c::drv_pre_reset(); + + this.slave_mp.slv_axi_cb.w_ready <= 0; + @(slave_mp.slv_axi_cb); + +endtask: drv_pre_reset + +task uvma_axi_w_drv_c::drv_in_reset(); + + this.slave_mp.slv_axi_cb.w_ready <= 0; + @(slave_mp.slv_axi_cb); + +endtask: drv_in_reset + +task uvma_axi_w_drv_c::drv_post_reset(); + + seq_item_port.get_next_item(w_item); + `uvm_info(get_type_name(), $sformatf("write data driver start"), UVM_LOW) + this.slave_mp.slv_axi_cb.w_ready <= 1'b1; + @(slave_mp.slv_axi_cb); + seq_item_port.item_done(); + +endtask: drv_post_reset + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv index eb1fb3c4c..4ee256077 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv @@ -17,14 +17,18 @@ class uvma_axi_w_mon_c extends uvm_monitor; `uvm_component_utils(uvma_axi_w_mon_c) + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; uvma_axi_w_item_c w_item; + uvma_axi_w_item_c wdrv_item; uvm_analysis_port #(uvma_axi_w_item_c) uvma_w_mon_port; + uvm_analysis_port #(uvma_axi_w_item_c) uvma_w_mon2drv_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; + virtual uvma_axi_intf vif; extern function new(string name = "uvma_axi_w_mon_c", uvm_component parent); extern virtual function void build_phase(uvm_phase phase); @@ -37,6 +41,7 @@ function uvma_axi_w_mon_c::new(string name = "uvma_axi_w_mon_c", uvm_component p super.new(name, parent); uvma_w_mon_port = new("uvma_w_mon_port", this); + uvma_w_mon2drv_port = new("uvma_w_mon2drv_port", this); endfunction @@ -50,8 +55,15 @@ function void uvma_axi_w_mon_c::build_phase(uvm_phase phase); end passive_mp = cntxt.axi_vi.passive; + vif = cntxt.axi_vi; w_item = uvma_axi_w_item_c::type_id::create("w_item", this); + wdrv_item = uvma_axi_w_item_c::type_id::create("wdrv_item", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end endfunction @@ -70,6 +82,16 @@ task uvma_axi_w_mon_c::monitor_w_items(); w_item.w_user = passive_mp.psv_axi_cb.w_user; w_item.w_valid = passive_mp.psv_axi_cb.w_valid; w_item.w_ready = passive_mp.psv_axi_cb.w_ready; + if(cfg.is_active) begin + // collect AR signals + this.wdrv_item.w_strb = vif.w_strb; + this.wdrv_item.w_data = vif.w_data; + this.wdrv_item.w_last = vif.w_last; + this.wdrv_item.w_user = vif.w_user; + this.wdrv_item.w_valid = vif.w_valid; + this.wdrv_item.w_ready = vif.w_ready; + this.uvma_w_mon2drv_port.write(this.wdrv_item); + end this.uvma_w_mon_port.write(this.w_item); @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_sqr.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_sqr.sv new file mode 100644 index 000000000..0c9589b61 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_sqr.sv @@ -0,0 +1,58 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +/**** AXI4 master sequencer ****/ + +`ifndef __UVMA_AXI_W_SQR_SV__ +`define __UVMA_AXI_W_SQR_SV__ + +class uvma_axi_w_sqr_c extends uvm_sequencer#(uvma_axi_w_item_c); + + `uvm_component_utils(uvma_axi_w_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvm_analysis_export #(uvma_axi_w_item_c) w_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_aw_item_c) aw_req_export; + uvm_tlm_analysis_fifo #(uvma_axi_w_item_c) w_req_fifo; + + function new(string name = "uvma_axi_w_sqr_c", uvm_component parent = null); + + super.new(name, parent); + + this.w_req_export = new("w_req_export", this); + this.aw_req_export = new("aw_req_export", this); + this.w_req_fifo = new("w_req_fifo", this); + + void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); + if (cfg == null) begin + `uvm_fatal("CFG", "Configuration handle is null") + end + + void'(uvm_config_db#(uvma_axi_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (cntxt == null) begin + `uvm_fatal("CNTXT", "Context handle is null") + end + + endfunction + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + endfunction + + function void connect_phase(uvm_phase phase); + super.connect_phase(phase); + this.w_req_export.connect(this.w_req_fifo.analysis_export); // Connect analysis export direct to fifo w channels + endfunction + +endclass + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv new file mode 100644 index 000000000..0f4e6ac16 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv @@ -0,0 +1,39 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + + +`ifndef __UVMA_AXI_CFG_SV__ +`define __UVMA_AXI_CFG_SV__ + +class uvma_axi_cfg_c extends uvm_object; + + rand uvm_active_passive_enum is_active; + + + `uvm_object_utils_begin(uvma_axi_cfg_c) + `uvm_field_enum(uvm_active_passive_enum, is_active, UVM_DEFAULT); + `uvm_object_utils_end + + constraint defaults_config { + soft is_active == UVM_ACTIVE; + } + + extern function new(string name = "uvma_axi_cfg"); + +endclass : uvma_axi_cfg_c + + +function uvma_axi_cfg_c::new(string name = "uvma_axi_cfg"); + + super.new(name); + +endfunction : new + +`endif //__UVMA_AXI_CFG_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv index b11bbbb04..a1dba6b06 100644 --- a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv +++ b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cntxt.sv @@ -20,6 +20,9 @@ class uvma_axi_cntxt_c extends uvm_object; // Handle to agent interface virtual uvma_axi_intf axi_vi; + // Handle to memory storage for active slaves + uvml_mem_c mem; + uvma_axi_reset_state_enum reset_state = UVMA_AXI_RESET_STATE_PRE_RESET; `uvm_object_utils_begin(uvma_axi_cntxt_c) @@ -36,6 +39,7 @@ endclass : uvma_axi_cntxt_c function uvma_axi_cntxt_c::new(string name = "uvma_axi_cntxt"); super.new(name); + mem = uvml_mem_c#(64)::type_id::create("mem"); endfunction : new diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv new file mode 100644 index 000000000..d4fa0c652 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv @@ -0,0 +1,54 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +//============================================================================= +// Description: Sequence for agent axi_ar +//============================================================================= + +`ifndef UVMA_AXI_AR_SEQ_SV +`define UVMA_AXI_AR_SEQ_SV + +class uvma_axi_ar_seq_c extends uvm_sequence#(uvma_axi_ar_item_c); + + `uvm_object_utils(uvma_axi_ar_seq_c) + `uvm_declare_p_sequencer(uvma_axi_ar_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + uvma_axi_ar_item_c req_item; + + extern function new(string name = ""); + extern task body(); + +endclass : uvma_axi_ar_seq_c + + +function uvma_axi_ar_seq_c::new(string name = ""); + super.new(name); +endfunction : new + +task uvma_axi_ar_seq_c::body(); + forever begin + cfg = p_sequencer.cfg; + cntxt = p_sequencer.cntxt; + + req_item = uvma_axi_ar_item_c::type_id::create("req_item"); + p_sequencer.ar_req_fifo.get(req_item); + + start_item(req_item); + `uvm_info(get_type_name(), "READ ADDRESS sequence starting", UVM_LOW) + finish_item(req_item); + end + `uvm_info(get_type_name(), "Default sequence completed", UVM_LOW) + +endtask : body + +`endif + diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv new file mode 100644 index 000000000..04a0e6257 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv @@ -0,0 +1,56 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +//============================================================================= +// Description: Sequence for agent axi_aw +//============================================================================= + +`ifndef UVMA_AXI_AW_SEQ_SV +`define UVMA_AXI_AW_SEQ_SV + +class uvma_axi_aw_seq_c extends uvm_sequence#(uvma_axi_aw_item_c); + + `uvm_object_utils(uvma_axi_aw_seq_c) + `uvm_declare_p_sequencer(uvma_axi_aw_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_aw_item_c req_item; + + extern function new(string name = ""); + extern task body(); + +endclass : uvma_axi_aw_seq_c + + +function uvma_axi_aw_seq_c::new(string name = ""); + super.new(name); +endfunction : new + +task uvma_axi_aw_seq_c::body(); + forever begin + cfg = p_sequencer.cfg ; + cntxt = p_sequencer.cntxt; + + req_item = uvma_axi_aw_item_c::type_id::create("req_item"); + p_sequencer.aw_req_fifo.get(req_item); + + start_item(req_item); + `uvm_info(get_type_name(), "WRITE ADDRESS sequence starting", UVM_LOW) + finish_item(req_item); + + end + `uvm_info(get_type_name(), "Default sequence completed", UVM_LOW) + +endtask : body + +`endif + diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv new file mode 100644 index 000000000..8edb9d0fc --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv @@ -0,0 +1,187 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + + +//============================================================================= +// Description: Sequence for agent axi_b +//============================================================================= + +`ifndef UVMA_AXI_B_SEQ_SV +`define UVMA_AXI_B_SEQ_SV + +class uvma_axi_b_seq_c extends uvm_sequence#(uvma_axi_b_item_c); + + `uvm_object_utils(uvma_axi_b_seq_c) + `uvm_declare_p_sequencer(uvma_axi_b_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_b_item_c b_resp_item; + uvma_axi_b_item_c b_preresp_item; + uvma_axi_aw_item_c aw_req_item; + uvma_axi_aw_item_c req_requette[][]; + uvma_axi_w_item_c w_req_item; + + int aw_id_tr[]; + int req_status[][]; + int status[]; + int first_req = 0; + int selected_id; + int enable_change_id = 1; + + extern function new(string name = ""); + extern function void create_item(); + extern task body(); + extern function int check_tab(int tab[]); + +endclass : uvma_axi_b_seq_c + +function uvma_axi_b_seq_c::new(string name = ""); + super.new(name); +endfunction : new + +function void uvma_axi_b_seq_c::create_item(); + + b_resp_item = uvma_axi_b_item_c::type_id::create("b_resp_item"); + b_preresp_item = uvma_axi_b_item_c::type_id::create("b_preresp_item"); + aw_req_item = uvma_axi_aw_item_c::type_id::create("aw_req_item"); + w_req_item = uvma_axi_w_item_c::type_id::create("w_req_item"); + +endfunction : create_item + +task uvma_axi_b_seq_c::body(); + + create_item(); + + forever begin + + cfg = p_sequencer.cfg ; + cntxt = p_sequencer.cntxt; + + `uvm_info(get_type_name(), "WRITE RESPONSE sequence starting", UVM_LOW) + + p_sequencer.aw_req_export.get(aw_req_item); + p_sequencer.w_req_export.get(w_req_item); + p_sequencer.b_resp_fifo.get(b_preresp_item); + + start_item(b_resp_item); + + if(aw_req_item.aw_valid && aw_req_item.aw_ready) begin + + `uvm_info(get_type_name(), "read request registere", UVM_HIGH) + if(aw_req_item.aw_id >= aw_id_tr.size()) begin + + aw_id_tr = new[aw_req_item.aw_id+1] (aw_id_tr); + aw_id_tr[aw_req_item.aw_id] = 1; + req_requette = new[aw_req_item.aw_id + 1] (req_requette); + req_requette[aw_req_item.aw_id] = new[1]; + req_requette[aw_req_item.aw_id][0] = new aw_req_item; + + end else begin + + aw_id_tr[aw_req_item.aw_id]++; + req_requette[aw_req_item.aw_id] = new[aw_id_tr[aw_req_item.aw_id]] (req_requette[aw_req_item.aw_id]); + req_requette[aw_req_item.aw_id][aw_id_tr[aw_req_item.aw_id] - 1] = new aw_req_item; + + end + + req_status = new[req_status.size() + 1] (req_status); + req_status[req_status.size() - 1] = new[aw_req_item.aw_id + 1]; + req_status[req_status.size() - 1][aw_req_item.aw_id] = 1; + + `uvm_info(get_type_name(), "read request registred", UVM_HIGH) + end + + if((w_req_item.w_valid && w_req_item.w_ready && w_req_item.w_last) || (first_req == 1)) begin + + `uvm_info(get_type_name(), "write data registred", UVM_HIGH) + if(req_status.size() != 0) begin + + foreach(req_status[i,j]) begin + + if(req_status[0][j] == 1) begin + status = new[status.size() + 1] (status); + status[status.size() - 1] = j; + end + + end + + foreach(req_status[i,j]) begin + if(i < req_status.size()-1) begin + req_status[i] = req_status[i+1]; + end + end + req_status = new[req_status.size() - 1] (req_status); + first_req = 0; + + end else begin + first_req = 1; + end + `uvm_info(get_type_name(), "write data registred", UVM_HIGH) + end + + + if(enable_change_id == 1) begin + selected_id = check_tab(status); + end + + `uvm_info(get_type_name(), $sformatf("selected id = %d", selected_id), UVM_HIGH) + + if(selected_id != -1) begin + `uvm_info(get_type_name(), "send resp", UVM_HIGH) + + b_resp_item.b_id = req_requette[selected_id][0].aw_id; + b_resp_item.b_resp = 0; + b_resp_item.b_valid = 1; + b_resp_item.b_user = 0; + + if(b_preresp_item.b_ready) begin + + foreach(req_requette[i,j]) begin + req_requette[selected_id][j] = req_requette[selected_id][j+1]; + end + req_requette[selected_id] = new[aw_id_tr[selected_id] - 1] (req_requette[selected_id]); + aw_id_tr[selected_id]--; + + foreach(status[i]) begin + status[i] = status[i+1]; + end + status = new[status.size() - 1] (status); + + enable_change_id = 1; + end else begin + enable_change_id = 0; + end + + end else begin + + `uvm_info(get_type_name(), " No resp to send ", UVM_HIGH) + b_resp_item.b_valid = 0; + b_resp_item.b_id = 0; + b_resp_item.b_resp = 0; + b_resp_item.b_user = 0; + + end + + finish_item(b_resp_item); + `uvm_info(get_type_name(), "Default sequence completed", UVM_LOW) + end +endtask : body + +function int uvma_axi_b_seq_c::check_tab(int tab[]); + int j = -1; + if (status.size() != 0) begin + j = status[0]; + end + return j; +endfunction : check_tab + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_fw_preload_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_fw_preload_seq.sv new file mode 100644 index 000000000..8710bba08 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_fw_preload_seq.sv @@ -0,0 +1,91 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + + +`ifndef __UVMA_AXI_FW_PRELOAD_SEQ_SV__ +`define __UVMA_AXI_FW_PRELOAD_SEQ_SV__ + + +/** + * Virtual sequence implementing the cv32e40x virtual peripherals. + * TODO Move most of the functionality to a cv32e env base class. + */ +class uvma_axi_fw_preload_seq_c extends uvm_sequence; + + static uvm_cmdline_processor uvcl = uvm_cmdline_processor::get_inst(); + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvml_mem_c mem; + + bit[63:0] value; + logic [7:0][7:0] mem_row; + string binary = ""; + longint address; + longint len; + byte buffer[]; + + `uvm_object_utils(uvma_axi_fw_preload_seq_c) + `uvm_declare_p_sequencer(uvma_axi_r_sqr_c) + + /** + * Default constructor. + */ + extern function new(string name="uvma_axi_fw_preload_seq"); + + + extern virtual task body(); + +endclass : uvma_axi_fw_preload_seq_c + +function uvma_axi_fw_preload_seq_c::new(string name="uvma_axi_fw_preload_seq"); + + super.new(name); + mem = uvml_mem_c::type_id::create("mem"); + +endfunction : new + +task uvma_axi_fw_preload_seq_c::body(); + + cfg = p_sequencer.cfg ; + void'(uvcl.get_arg_value("+PRELOAD=", binary)); + + if (binary != "") begin + void'(read_elf(binary)); + wait(p_sequencer.cntxt.axi_vi.clk); + // while there are more sections to process + while (get_section(address, len)) begin + automatic int num_words0 = (len+7)/8; + `uvm_info( "Core Test", $sformatf("Loading Address: %x, Length: %x", address, len), UVM_HIGH) + buffer = new [num_words0*8]; + void'(read_section(address, buffer)); + // preload memories + // 64-bit + for (int i = 0; i < num_words0; i++) begin + mem_row = '0; + for (int j = 0; j < 8; j++) begin + mem_row[j] = buffer[i*8 + j]; + end + mem.write(address + i*8 + 0, mem_row[0]); + mem.write(address + i*8 + 1, mem_row[1]); + mem.write(address + i*8 + 2, mem_row[2]); + mem.write(address + i*8 + 3, mem_row[3]); + mem.write(address + i*8 + 4, mem_row[4]); + mem.write(address + i*8 + 5, mem_row[5]); + mem.write(address + i*8 + 6, mem_row[6]); + mem.write(address + i*8 + 7, mem_row[7]); + end + p_sequencer.cntxt.mem = mem; + end + end + +endtask : body + +`endif // __UVMA_AXI_FW_PRELOAD_SEQ_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv new file mode 100644 index 000000000..2cf7563ca --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv @@ -0,0 +1,213 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +//============================================================================= +// Description: Sequence for agent axi_r +//============================================================================= + +`ifndef UVMA_AXI_R_SEQ_SV +`define UVMA_AXI_R_SEQ_SV + +class uvma_axi_r_seq_c extends uvm_sequence#(uvma_axi_r_item_c); + + + int i = 0; + + `uvm_object_utils(uvma_axi_r_seq_c) + `uvm_declare_p_sequencer(uvma_axi_r_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_r_item_c resp_item; + uvma_axi_r_item_c pre_resp; + uvma_axi_ar_item_c req_item; + uvma_axi_ar_item_c req_requette[][]; + + int selected_id; + int ar_id_tr[]; + int enable_change_id = 1; + bit[1:0] inject_error; + int selected_indice = 0; + int status[]; + int r_latency; + + + extern function new(string name = ""); + extern function void create_item(); + extern task body(); + extern function int check_tab(int tab[]); + extern function void prepare_resp(uvma_axi_ar_item_c req_item, uvma_axi_r_item_c resp_item, int error); + extern function int select_first_id(int tab[], int id); + +endclass : uvma_axi_r_seq_c + +function uvma_axi_r_seq_c::new(string name = ""); + + super.new(name); + +endfunction : new + +function void uvma_axi_r_seq_c::create_item(); + + resp_item = uvma_axi_r_item_c::type_id::create("resp_item"); + pre_resp = uvma_axi_r_item_c::type_id::create("pre_resp"); + req_item = uvma_axi_ar_item_c::type_id::create("req_item"); + +endfunction : create_item + +task uvma_axi_r_seq_c::body(); + + create_item(); + + forever begin + + cfg = p_sequencer.cfg ; + cntxt = p_sequencer.cntxt; + + `uvm_info(get_type_name(), "READ DATA sequence starting", UVM_LOW) + + p_sequencer.ar_req_export.get(req_item); + p_sequencer.r_resp_fifo.get(pre_resp); + + start_item(resp_item); + + if(req_item.ar_valid && req_item.ar_ready) begin + + `uvm_info(get_type_name(), "Read request registere", UVM_LOW) + if(req_item.ar_id >= ar_id_tr.size()) begin + + ar_id_tr = new[req_item.ar_id+1] (ar_id_tr); + ar_id_tr[req_item.ar_id] = 1; + req_requette = new[req_item.ar_id + 1] (req_requette); + req_requette[req_item.ar_id] = new[1]; + req_requette[req_item.ar_id][0] = new req_item; + + end else begin + + ar_id_tr[req_item.ar_id]++; + req_requette[req_item.ar_id] = new[ar_id_tr[req_item.ar_id]] (req_requette[req_item.ar_id]); + req_requette[req_item.ar_id][ar_id_tr[req_item.ar_id] - 1] = new req_item; + + end + `uvm_info(get_type_name(), "Read request registred", UVM_LOW) + status = new[status.size() + 1] (status); + status[status.size() - 1] = req_item.ar_id; + end + + if(enable_change_id == 1) begin + selected_id = check_tab(status); + r_latency = -1; + end + + `uvm_info(get_type_name(), $sformatf("r_ready id = %d || LATENCY = %d",pre_resp.r_ready, r_latency), UVM_LOW) + if(r_latency > -1 && pre_resp.r_ready && selected_id != -1) begin + + `uvm_info(get_type_name(), "transfert termine", UVM_LOW) + if(ar_id_tr[selected_id] > 0) begin + if(resp_item.r_last == 1'b1) begin + + foreach(req_requette[i,j]) begin + req_requette[selected_id][j] = req_requette[selected_id][j+1]; + end + req_requette[selected_id] = new[ar_id_tr[selected_id] - 1] (req_requette[selected_id]); + + ar_id_tr[selected_id]--; + + selected_indice = select_first_id(status, selected_id); + foreach(status[j]) begin + status[selected_indice + j] = status[selected_indice + j + 1]; + end + status = new[status.size() - 1] (status); + + end + end + + selected_id = check_tab(status); + inject_error = 1'b0; + r_latency = -1; + + if(selected_id == -1) begin + enable_change_id = 1; + end else begin + enable_change_id = 0; + end + + end + + `uvm_info(get_type_name(), $sformatf("selected id = %d || LATENCY = %d",selected_id, r_latency), UVM_LOW) + + if(selected_id != -1) begin + if(r_latency == -1) begin + + `uvm_info(get_type_name(), "read item", UVM_LOW) + prepare_resp(req_requette[selected_id][0], resp_item, inject_error); + if(req_requette[selected_id][0].ar_len == 0) begin + `uvm_info(get_type_name()," last will be asserted ",UVM_HIGH) + resp_item.r_last = 1'b1; + end else begin + req_requette[selected_id][0].ar_len--; + resp_item.r_last = 1'b0; + req_requette[selected_id][0].ar_addr = req_requette[selected_id][0].ar_addr + 2**req_requette[selected_id][0].ar_size; + end + enable_change_id = 0; + + end + r_latency++; + end else begin + resp_item.r_id = 0; + resp_item.r_data = 0; + resp_item.r_resp = 0; + resp_item.r_valid = 1'b0; + resp_item.r_user = 1'b0; + resp_item.r_last = 1'b0; + end + + finish_item(resp_item); + end + `uvm_info(get_type_name(), "Default sequence completed", UVM_LOW) + +endtask : body + +function void uvma_axi_r_seq_c::prepare_resp(uvma_axi_ar_item_c req_item, uvma_axi_r_item_c resp_item, int error); + + resp_item.r_id = req_item.ar_id; + for(int i = 0; i < 2**req_item.ar_size; i++) begin + resp_item.r_data [((i+1)*8-1)-:8] = cntxt.mem.read(req_item.ar_addr + i); + if($isunknown(resp_item.r_data[((i+1)*8-1)-:8])) begin + resp_item.r_data[((i+1)*8-1)-:8] = 2'h00; + end + end + resp_item.r_resp = error; + resp_item.r_valid = 1'b1; + resp_item.r_user = 1'b0; + +endfunction : prepare_resp + +function int uvma_axi_r_seq_c::check_tab(int tab[]); + int j = -1; + if (status.size() != 0) begin + j = status[0]; + end + return j; +endfunction : check_tab + +function int uvma_axi_r_seq_c::select_first_id(int tab[], int id); + int j = -1; + foreach(tab[i]) begin + if(tab[i] == id) begin + j = i; + return j; + end + end + return j; +endfunction : select_first_id + +`endif diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_seq_lib.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_seq_lib.sv new file mode 100644 index 000000000..706ae2491 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_seq_lib.sv @@ -0,0 +1,47 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + + +`ifndef __UVMA_AXI_SEQ_LIB_SV__ +`define __UVMA_AXI_SEQ_LIB_SV__ + + +`include "uvma_axi_fw_preload_seq.sv" +`include "uvma_axi_ar_seq.sv" +`include "uvma_axi_aw_seq.sv" +`include "uvma_axi_w_seq.sv" +`include "uvma_axi_r_seq.sv" +`include "uvma_axi_b_seq.sv" +`include "uvma_axi_vseq.sv" + +/** + * Object holding sequence library for Open Bus Interface agent. + */ +class uvma_axi_seq_lib_c extends uvm_sequence_library; + + `uvm_object_utils (uvma_axi_seq_lib_c) + `uvm_sequence_library_utils(uvma_axi_seq_lib_c) + + /** + * Initializes sequence library + */ + extern function new(string name="uvma_axi_seq_lib"); + +endclass : uvma_axi_seq_lib_c + + +function uvma_axi_seq_lib_c::new(string name="uvma_axi_seq_lib"); + + super.new(name); + init_sequence_library(); + +endfunction : new + +`endif // __UVMA_AXI_SEQ_LIB_SV__ + diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv new file mode 100644 index 000000000..e5c9489c7 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv @@ -0,0 +1,145 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +//============================================================================= +// Description: Sequence for agent axi_w +//============================================================================= + +`ifndef UVMA_AXI_W_SEQ_SV +`define UVMA_AXI_W_SEQ_SV + +class uvma_axi_w_seq_c extends uvm_sequence#(uvma_axi_w_item_c); + + `uvm_object_utils(uvma_axi_w_seq_c) + `uvm_declare_p_sequencer(uvma_axi_w_sqr_c) + + // Agent handles + uvma_axi_cfg_c cfg; + uvma_axi_cntxt_c cntxt; + + uvma_axi_aw_item_c aw_req_item; + uvma_axi_aw_item_c req_requette[]; + uvma_axi_w_item_c write_data_req[]; + uvma_axi_w_item_c w_req_item; + + int latency; + int w_ready_latency; + int status = 0; + bit write_status = 0; + int check_ready = 0; + int aw_latency[]; + + extern function new(string name = ""); + extern function void add_latencies(uvma_axi_w_item_c master_req); + extern task body(); + +endclass : uvma_axi_w_seq_c + + +function uvma_axi_w_seq_c::new(string name = ""); + super.new(name); +endfunction : new + +task uvma_axi_w_seq_c::body(); + + aw_req_item = uvma_axi_aw_item_c::type_id::create("aw_req_item"); + w_req_item = uvma_axi_w_item_c::type_id::create("w_req_item"); + + forever begin + + cfg = p_sequencer.cfg; + cntxt = p_sequencer.cntxt; + + `uvm_info(get_type_name(), "WRITE DATA sequence starting", UVM_LOW) + + p_sequencer.aw_req_export.get(aw_req_item); + p_sequencer.w_req_fifo.get(w_req_item); + + if(aw_req_item.aw_valid || check_ready == 1) begin + + if(aw_req_item.aw_valid) begin + req_requette = new[req_requette.size() + 1] (req_requette); + req_requette[req_requette.size() - 1] = new aw_req_item; + end + + if(!check_ready) begin + aw_latency = new[aw_latency.size() + 1] (aw_latency); + aw_latency[aw_latency.size() - 1] = -2; + end + + aw_latency[aw_latency.size() - 1]++; + check_ready = 1; + + if(aw_req_item.aw_ready && aw_latency[aw_latency.size() - 1] != -1) begin + check_ready = 0; + status = 1; + if(aw_req_item.aw_valid) begin + check_ready = 1; + aw_latency = new[aw_latency.size() + 1] (aw_latency); + aw_latency[aw_latency.size() - 1] = -1; + end + end + end + + start_item(w_req_item); + `uvm_info(get_type_name(), $sformatf("req_requette size = %d", req_requette.size()), UVM_LOW) + if(w_req_item.w_valid) begin + + write_data_req = new[write_data_req.size() + 1] (write_data_req); + write_data_req[write_data_req.size() - 1] = new w_req_item; + write_status = 1; + + end + + `uvm_info(get_type_name(), $sformatf("status = %d et write_status = %d", status, write_status), UVM_LOW) + if(status == 1 && write_status == 1) begin + + longint aligned_addr; + `uvm_info(get_type_name(), $sformatf("AXI_ADDR_WIDTH = %d et AXI_ADDR_WIDTH_BYTE = %d", AXI_ADDR_WIDTH, AXI_ADDR_WIDTH/8), UVM_LOW) + aligned_addr = req_requette[0].aw_addr - req_requette[0].aw_addr % (AXI_ADDR_WIDTH/8); + if(write_data_req[0].w_strb[0]) cntxt.mem.write(aligned_addr+0, write_data_req[0].w_data[07:00]); + if(write_data_req[0].w_strb[1]) cntxt.mem.write(aligned_addr+1, write_data_req[0].w_data[15:08]); + if(write_data_req[0].w_strb[2]) cntxt.mem.write(aligned_addr+2, write_data_req[0].w_data[23:16]); + if(write_data_req[0].w_strb[3]) cntxt.mem.write(aligned_addr+3, write_data_req[0].w_data[31:24]); + if(write_data_req[0].w_strb[4]) cntxt.mem.write(aligned_addr+4, write_data_req[0].w_data[39:32]); + if(write_data_req[0].w_strb[5]) cntxt.mem.write(aligned_addr+5, write_data_req[0].w_data[47:40]); + if(write_data_req[0].w_strb[6]) cntxt.mem.write(aligned_addr+6, write_data_req[0].w_data[55:48]); + if(write_data_req[0].w_strb[7]) cntxt.mem.write(aligned_addr+7, write_data_req[0].w_data[63:56]); + + if(write_data_req[0].w_last) begin + foreach(req_requette[i]) begin + req_requette[i] = req_requette[(i + aw_latency[0]) +1]; + end + req_requette = new[req_requette.size() - (1 + aw_latency[0])] (req_requette); + + foreach(aw_latency[i]) begin + aw_latency[i] = aw_latency[i + 1]; + end + aw_latency = new[aw_latency.size() - 1] (aw_latency); + + status =0; + end + + foreach(write_data_req[i]) begin + write_data_req[i] = write_data_req[i+1]; + end + write_data_req = new[write_data_req.size() - 1] (write_data_req); + if(write_data_req.size() == 0) begin + write_status =0; + end + + end + finish_item(w_req_item); + end + `uvm_info(get_type_name(), "Write data sequence completed", UVM_LOW) + +endtask : body + +`endif + diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv index ddcd92d1d..b06dc1b7b 100644 --- a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv @@ -24,6 +24,10 @@ package uvma_axi_pkg; import uvm_pkg::*; + import uvml_mem_pkg ::*; + import "DPI-C" function read_elf(input string filename); + import "DPI-C" function byte get_section(output longint address, output longint len); + import "DPI-C" context function void read_section(input longint address, inout byte buffer[]); localparam NrSlaves = 2; // actually masters, but slaves on the crossbar localparam IdWidth = 4; // 4 is recommended by AXI standard, so lets stick to it, do not change @@ -37,6 +41,7 @@ package uvma_axi_pkg; `include "uvma_axi_tdefs.sv" // Objects + `include "uvma_axi_cfg.sv" `include "uvma_axi_cntxt.sv" `include "uvma_axi_aw_item.sv" @@ -45,12 +50,22 @@ package uvma_axi_pkg; `include "uvma_axi_ar_item.sv" `include "uvma_axi_r_item.sv" + `include "uvma_axi_aw_drv.sv" + `include "uvma_axi_w_drv.sv" + `include "uvma_axi_b_drv.sv" + `include "uvma_axi_ar_drv.sv" + `include "uvma_axi_r_drv.sv" `include "uvma_axi_aw_mon.sv" `include "uvma_axi_w_mon.sv" `include "uvma_axi_b_mon.sv" `include "uvma_axi_ar_mon.sv" `include "uvma_axi_r_mon.sv" + `include "uvma_axi_aw_sqr.sv" + `include "uvma_axi_w_sqr.sv" + `include "uvma_axi_b_sqr.sv" + `include "uvma_axi_ar_sqr.sv" + `include "uvma_axi_r_sqr.sv" `include "uvma_axi_aw_agent.sv" `include "uvma_axi_w_agent.sv" @@ -58,7 +73,11 @@ package uvma_axi_pkg; `include "uvma_axi_ar_agent.sv" `include "uvma_axi_r_agent.sv" + `include "uvma_axi_vsqr.sv" + `include "uvma_axi_agent.sv" + // Sequences + `include "uvma_axi_seq_lib.sv" endpackage : uvma_axi_pkg From 305de5f168059735896cd2a487d6f587c6c3199c Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 7 Dec 2022 17:34:44 +0100 Subject: [PATCH 039/183] axi_agent: connect the axi agent to CVA6 in order to make the agent work in active mode Signed-off-by: Alae Eddine Ez zejjari --- cva6/env/uvme/uvme_cva6_cfg.sv | 5 + cva6/env/uvme/uvme_cva6_cntxt.sv | 8 ++ cva6/env/uvme/uvme_cva6_env.sv | 15 +++ cva6/env/uvme/uvme_cva6_pkg.sv | 1 + cva6/env/uvme/uvme_cva6_vsqr.sv | 1 + cva6/sim/Makefile | 1 + cva6/tb/uvmt/cva6_tb_wrapper.sv | 178 +++++++++---------------------- cva6/tb/uvmt/uvmt_cva6.flist | 1 + 8 files changed, 81 insertions(+), 129 deletions(-) diff --git a/cva6/env/uvme/uvme_cva6_cfg.sv b/cva6/env/uvme/uvme_cva6_cfg.sv index 24da1779d..6065c43e8 100644 --- a/cva6/env/uvme/uvme_cva6_cfg.sv +++ b/cva6/env/uvme/uvme_cva6_cfg.sv @@ -40,6 +40,7 @@ class uvme_cva6_cfg_c extends uvm_object; // Agent cfg handles rand uvma_clknrst_cfg_c clknrst_cfg; rand uvma_cvxif_cfg_c cvxif_cfg; + rand uvma_axi_cfg_c axi_cfg; `uvm_object_utils_begin(uvme_cva6_cfg_c) `uvm_field_int ( enabled , UVM_DEFAULT ) @@ -53,6 +54,8 @@ class uvme_cva6_cfg_c extends uvm_object; `uvm_field_object(cvxif_cfg, UVM_DEFAULT) + `uvm_field_object(axi_cfg, UVM_DEFAULT) + `uvm_object_utils_end @@ -71,6 +74,7 @@ class uvme_cva6_cfg_c extends uvm_object; } if (is_active == UVM_ACTIVE) { clknrst_cfg.is_active == UVM_ACTIVE; + axi_cfg.is_active == UVM_ACTIVE; } if (trn_log_enabled) { @@ -97,6 +101,7 @@ function uvme_cva6_cfg_c::new(string name="uvme_cva6_cfg"); clknrst_cfg = uvma_clknrst_cfg_c::type_id::create("clknrst_cfg"); cvxif_cfg = uvma_cvxif_cfg_c::type_id::create("cvxif_cfg"); + axi_cfg = uvma_axi_cfg_c::type_id::create("axi_cfg"); endfunction : new diff --git a/cva6/env/uvme/uvme_cva6_cntxt.sv b/cva6/env/uvme/uvme_cva6_cntxt.sv index 7973f1869..5a4433661 100644 --- a/cva6/env/uvme/uvme_cva6_cntxt.sv +++ b/cva6/env/uvme/uvme_cva6_cntxt.sv @@ -32,6 +32,9 @@ class uvme_cva6_cntxt_c extends uvm_object; uvma_cvxif_cntxt_c cvxif_cntxt; uvma_axi_cntxt_c axi_cntxt; +// Memory modelling + rand uvml_mem_c mem; + // Events uvm_event sample_cfg_e; uvm_event sample_cntxt_e; @@ -42,8 +45,12 @@ class uvme_cva6_cntxt_c extends uvm_object; `uvm_field_object(axi_cntxt, UVM_DEFAULT) `uvm_field_event(sample_cfg_e , UVM_DEFAULT) `uvm_field_event(sample_cntxt_e, UVM_DEFAULT) + `uvm_field_object(mem, UVM_DEFAULT) `uvm_object_utils_end + constraint mem_cfg_cons { + mem.mem_default == MEM_DEFAULT_0; + } /** * Builds events and sub-context objects. @@ -59,6 +66,7 @@ function uvme_cva6_cntxt_c::new(string name="uvme_cva6_cntxt"); clknrst_cntxt = uvma_clknrst_cntxt_c::type_id::create("clknrst_cntxt"); axi_cntxt = uvma_axi_cntxt_c::type_id::create("axi_cntxt"); + mem = uvml_mem_c::type_id::create("mem"); sample_cfg_e = new("sample_cfg_e" ); sample_cntxt_e = new("sample_cntxt_e"); diff --git a/cva6/env/uvme/uvme_cva6_env.sv b/cva6/env/uvme/uvme_cva6_env.sv index ed22eba52..008abaa12 100644 --- a/cva6/env/uvme/uvme_cva6_env.sv +++ b/cva6/env/uvme/uvme_cva6_env.sv @@ -203,6 +203,8 @@ function void uvme_cva6_env_c::assign_cfg(); uvm_config_db#(uvma_cvxif_cfg_c)::set(this, "*cvxif_agent", "cfg", cfg.cvxif_cfg); + uvm_config_db#(uvma_axi_cfg_c)::set(this, "*axi_agent", "cfg", cfg.axi_cfg); + endfunction: assign_cfg @@ -269,16 +271,29 @@ function void uvme_cva6_env_c::assemble_vsequencer(); vsequencer.clknrst_sequencer = clknrst_agent.sequencer; vsequencer.cvxif_sequencer = cvxif_agent.sequencer; + vsequencer.axi_vsequencer = axi_agent.vsequencer; endfunction: assemble_vsequencer task uvme_cva6_env_c::run_phase(uvm_phase phase); + fork + + begin uvma_cvxif_seq_c cvxif_seq; cvxif_seq = uvma_cvxif_seq_c::type_id::create("cvxif_seq"); cvxif_seq.start(cvxif_agent.sequencer); + end + begin + if(cfg.axi_cfg.is_active == UVM_ACTIVE) begin + uvma_axi_vseq_c axi_vseq; + axi_vseq = uvma_axi_vseq_c::type_id::create("axi_vseq"); + axi_vseq.start(axi_agent.vsequencer); + end + end + join_none endtask function void uvme_cva6_env_c::connect_coverage_model(); diff --git a/cva6/env/uvme/uvme_cva6_pkg.sv b/cva6/env/uvme/uvme_cva6_pkg.sv index ea93a206e..52876c643 100644 --- a/cva6/env/uvme/uvme_cva6_pkg.sv +++ b/cva6/env/uvme/uvme_cva6_pkg.sv @@ -44,6 +44,7 @@ package uvme_cva6_pkg; import uvma_clknrst_pkg::*; import uvma_cvxif_pkg::*; import uvma_axi_pkg::*; + import uvml_mem_pkg ::*; // Constants / Structs / Enums `include "uvme_cva6_constants.sv" diff --git a/cva6/env/uvme/uvme_cva6_vsqr.sv b/cva6/env/uvme/uvme_cva6_vsqr.sv index 89b058374..d51e98c87 100644 --- a/cva6/env/uvme/uvme_cva6_vsqr.sv +++ b/cva6/env/uvme/uvme_cva6_vsqr.sv @@ -37,6 +37,7 @@ class uvme_cva6_vsqr_c extends uvm_sequencer#( // Sequencer handles uvma_clknrst_sqr_c clknrst_sequencer; uvma_cvxif_sqr_c cvxif_sequencer; + uvma_axi_vsqr_c axi_vsequencer; `uvm_component_utils_begin(uvme_cva6_vsqr_c) diff --git a/cva6/sim/Makefile b/cva6/sim/Makefile index bb8bd4231..08a0c2b99 100644 --- a/cva6/sim/Makefile +++ b/cva6/sim/Makefile @@ -145,6 +145,7 @@ export DV_UVMA_INTERRUPT_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_interrupt export DV_UVMA_DEBUG_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_debug export DV_UVMA_OBI_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_obi export DV_UVML_TRN_PATH = $(CORE_V_VERIF)/lib/uvm_libs/uvml_trn +export DV_UVML_MEM_PATH = $(CORE_V_VERIF)/lib/uvm_libs/uvml_mem export DV_UVML_LOGS_PATH = $(CORE_V_VERIF)/lib/uvm_libs/uvml_logs export DV_UVML_SB_PATH = $(CORE_V_VERIF)/lib/uvm_libs/uvml_sb export CV_CORE_PKG = $(CORE_V_VERIF)/core-v-cores/$(CV_CORE_LC) diff --git a/cva6/tb/uvmt/cva6_tb_wrapper.sv b/cva6/tb/uvmt/cva6_tb_wrapper.sv index f1d740430..c94be22f1 100644 --- a/cva6/tb/uvmt/cva6_tb_wrapper.sv +++ b/cva6/tb/uvmt/cva6_tb_wrapper.sv @@ -105,138 +105,58 @@ module cva6_tb_wrapper #( logic [AXI_DATA_WIDTH-1:0] rdata; logic [AXI_USER_WIDTH-1:0] ruser; - AXI_BUS #( - .AXI_ADDR_WIDTH ( AXI_ADDRESS_WIDTH ), - .AXI_DATA_WIDTH ( AXI_DATA_WIDTH ), - .AXI_ID_WIDTH ( ariane_soc::IdWidthSlave ), - .AXI_USER_WIDTH ( AXI_USER_WIDTH ) - ) cva6_axi_bus(); - - axi_master_connect #( - ) i_axi_master_connect_cva6_to_mem ( - .axi_req_i (axi_ariane_req), - .axi_resp_o (axi_ariane_resp), - .master (cva6_axi_bus) - ); - - axi2mem #( - .AXI_ID_WIDTH ( ariane_soc::IdWidthSlave ), - .AXI_ADDR_WIDTH ( AXI_ADDRESS_WIDTH ), - .AXI_DATA_WIDTH ( AXI_DATA_WIDTH ), - .AXI_USER_WIDTH ( AXI_USER_WIDTH ) - ) i_cva6_axi2mem ( - .clk_i ( clk_i ), - .rst_ni ( rst_ni ), - .slave ( cva6_axi_bus ), - .req_o ( req ), - .we_o ( we ), - .addr_o ( addr ), - .be_o ( be ), - .user_o ( wuser ), - .data_o ( wdata ), - .user_i ( ruser ), - .data_i ( rdata ) - ); - - sram #( - .USER_WIDTH ( AXI_USER_WIDTH ), - .DATA_WIDTH ( AXI_DATA_WIDTH ), - .USER_EN ( AXI_USER_EN ), - .SIM_INIT ( "zeros" ), - .NUM_WORDS ( NUM_WORDS ) - ) i_sram ( - .clk_i ( clk_i ), - .rst_ni ( rst_ni ), - .req_i ( req ), - .we_i ( we ), - .addr_i ( addr[$clog2(NUM_WORDS)-1+$clog2(AXI_DATA_WIDTH/8):$clog2(AXI_DATA_WIDTH/8)] ), - .wuser_i ( wuser ), - .wdata_i ( wdata ), - .be_i ( be ), - .ruser_o ( ruser ), - .rdata_o ( rdata ) - ); - - // AW Channel - assign axi_slave.aw_valid = cva6_axi_bus.aw_valid; - assign axi_slave.aw_ready = cva6_axi_bus.aw_ready; - assign axi_slave.aw_id = cva6_axi_bus.aw_id; - assign axi_slave.aw_addr = cva6_axi_bus.aw_addr; - assign axi_slave.aw_len = cva6_axi_bus.aw_len; - assign axi_slave.aw_size = cva6_axi_bus.aw_size; - assign axi_slave.aw_burst = cva6_axi_bus.aw_burst; - assign axi_slave.aw_lock = cva6_axi_bus.aw_lock; - assign axi_slave.aw_cache = cva6_axi_bus.aw_cache; - assign axi_slave.aw_prot = cva6_axi_bus.aw_prot; - assign axi_slave.aw_qos = cva6_axi_bus.aw_qos; - assign axi_slave.aw_region = cva6_axi_bus.aw_region; - assign axi_slave.aw_user = cva6_axi_bus.aw_user; - assign axi_slave.aw_atop = cva6_axi_bus.aw_atop; - // W Channel - assign axi_slave.w_valid = cva6_axi_bus.w_valid; - assign axi_slave.w_ready = cva6_axi_bus.w_ready; - assign axi_slave.w_data = cva6_axi_bus.w_data; - assign axi_slave.w_strb = cva6_axi_bus.w_strb; - assign axi_slave.w_last = cva6_axi_bus.w_last; - assign axi_slave.w_user = cva6_axi_bus.w_user; + //Response structs + assign axi_ariane_resp.aw_ready = axi_slave.aw_ready; + assign axi_ariane_resp.ar_ready = axi_slave.ar_ready; + assign axi_ariane_resp.w_ready = axi_slave.w_ready; + assign axi_ariane_resp.b_valid = axi_slave.b_valid; + assign axi_ariane_resp.r_valid = axi_slave.r_valid; // B Channel - assign axi_slave.b_valid = cva6_axi_bus.b_valid; - assign axi_slave.b_ready = cva6_axi_bus.b_ready; - assign axi_slave.b_id = cva6_axi_bus.b_id; - assign axi_slave.b_resp = cva6_axi_bus.b_resp; - assign axi_slave.b_user = cva6_axi_bus.b_user; - // AR Channel - assign axi_slave.ar_valid = cva6_axi_bus.ar_valid; - assign axi_slave.ar_ready = cva6_axi_bus.ar_ready; - assign axi_slave.ar_id = cva6_axi_bus.ar_id; - assign axi_slave.ar_addr = cva6_axi_bus.ar_addr; - assign axi_slave.ar_len = cva6_axi_bus.ar_len; - assign axi_slave.ar_size = cva6_axi_bus.ar_size; - assign axi_slave.ar_burst = cva6_axi_bus.ar_burst; - assign axi_slave.ar_lock = cva6_axi_bus.ar_lock; - assign axi_slave.ar_cache = cva6_axi_bus.ar_cache; - assign axi_slave.ar_prot = cva6_axi_bus.ar_prot; - assign axi_slave.ar_qos = cva6_axi_bus.ar_qos; - assign axi_slave.ar_region = cva6_axi_bus.ar_region; - assign axi_slave.ar_user = cva6_axi_bus.ar_user; + assign axi_ariane_resp.b.id = axi_slave.b_id; + assign axi_ariane_resp.b.resp = axi_slave.b_resp; + assign axi_ariane_resp.b.user = axi_slave.b_user; // R Channel - assign axi_slave.r_valid = cva6_axi_bus.r_valid; - assign axi_slave.r_ready = cva6_axi_bus.r_ready; - assign axi_slave.r_id = cva6_axi_bus.r_id; - assign axi_slave.r_data = cva6_axi_bus.r_data; - assign axi_slave.r_resp = cva6_axi_bus.r_resp; - assign axi_slave.r_last = cva6_axi_bus.r_last; - assign axi_slave.r_user = cva6_axi_bus.r_user; - initial begin - automatic logic [7:0][7:0] mem_row; - longint address; - longint len; - byte buffer[]; - void'(uvcl.get_arg_value("+PRELOAD=", binary)); + assign axi_ariane_resp.r.id = axi_slave.r_id; + assign axi_ariane_resp.r.data = axi_slave.r_data; + assign axi_ariane_resp.r.resp = axi_slave.r_resp; + assign axi_ariane_resp.r.last = axi_slave.r_last; + assign axi_ariane_resp.r.user = axi_slave.r_user; - if (binary != "") begin + // Request structs + assign axi_slave.aw_valid = axi_ariane_req.aw_valid; + assign axi_slave.w_valid = axi_ariane_req.w_valid; + assign axi_slave.b_ready = axi_ariane_req.b_ready; + assign axi_slave.ar_valid = axi_ariane_req.ar_valid; + assign axi_slave.r_ready = axi_ariane_req.r_ready; + // AW Channel + assign axi_slave.aw_id = axi_ariane_req.aw.id; + assign axi_slave.aw_addr = axi_ariane_req.aw.addr; + assign axi_slave.aw_len = axi_ariane_req.aw.len; + assign axi_slave.aw_size = axi_ariane_req.aw.size; + assign axi_slave.aw_burst = axi_ariane_req.aw.burst; + assign axi_slave.aw_lock = axi_ariane_req.aw.lock; + assign axi_slave.aw_cache = axi_ariane_req.aw.cache; + assign axi_slave.aw_prot = axi_ariane_req.aw.prot; + assign axi_slave.aw_qos = axi_ariane_req.aw.qos; + assign axi_slave.aw_region = axi_ariane_req.aw.region; + assign axi_slave.aw_user = 0; + // W Channel + assign axi_slave.w_data = axi_ariane_req.w.data; + assign axi_slave.w_strb = axi_ariane_req.w.strb; + assign axi_slave.w_last = axi_ariane_req.w.last; + assign axi_slave.w_user = 0; + // AR Channel + assign axi_slave.ar_id = axi_ariane_req.ar.id; + assign axi_slave.ar_addr = axi_ariane_req.ar.addr; + assign axi_slave.ar_len = axi_ariane_req.ar.len; + assign axi_slave.ar_size = axi_ariane_req.ar.size; + assign axi_slave.ar_burst = axi_ariane_req.ar.burst; + assign axi_slave.ar_lock = axi_ariane_req.ar.lock; + assign axi_slave.ar_cache = axi_ariane_req.ar.cache; + assign axi_slave.ar_prot = axi_ariane_req.ar.prot; + assign axi_slave.ar_qos = axi_ariane_req.ar.qos; + assign axi_slave.ar_region = axi_ariane_req.ar.region; + assign axi_slave.ar_user = 0; - void'(read_elf(binary)); - - wait(clk_i); - - // while there are more sections to process - while (get_section(address, len)) begin - automatic int num_words0 = (len+7)/8; - `uvm_info( "Core Test", $sformatf("Loading Address: %x, Length: %x", address, len), UVM_LOW) - buffer = new [num_words0*8]; - void'(read_section(address, buffer)); - // preload memories - // 64-bit - for (int i = 0; i < num_words0; i++) begin - mem_row = '0; - for (int j = 0; j < 8; j++) begin - mem_row[j] = buffer[i*8 + j]; - end - `MAIN_MEM((address[23:0] >> 3) + i) = mem_row; - end - end - end - end endmodule diff --git a/cva6/tb/uvmt/uvmt_cva6.flist b/cva6/tb/uvmt/uvmt_cva6.flist index d70c0ab92..0c04c48ad 100644 --- a/cva6/tb/uvmt/uvmt_cva6.flist +++ b/cva6/tb/uvmt/uvmt_cva6.flist @@ -18,6 +18,7 @@ -f ${DV_UVML_HRTBT_PATH}/uvml_hrtbt_pkg.flist -f ${DV_UVML_TRN_PATH}/uvml_trn_pkg.flist -f ${DV_UVML_LOGS_PATH}/uvml_logs_pkg.flist +-f ${DV_UVML_MEM_PATH}/uvml_mem_pkg.flist -f ${DV_UVML_SB_PATH}/uvml_sb_pkg.flist // Agents From a51df638a938ee7a0ff710d5f46c8b74675ea587 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 28 Dec 2022 10:11:52 +0100 Subject: [PATCH 040/183] axi_agent : Add function to randomize response error and the ready latency Signed-off-by: Alae Eddine Ez zejjari --- .../uvma_axi_ar_agent/uvma_axi_ar_drv.sv | 8 +- .../uvma_axi_aw_agent/uvma_axi_aw_drv.sv | 9 +- .../comps/uvma_axi_w_agent/uvma_axi_w_drv.sv | 2 +- .../uvma_axi/src/obj/uvma_axi_cfg.sv | 97 +++++++++++++++++++ .../uvma_axi/src/seq/uvma_axi_ar_item.sv | 2 + .../uvma_axi/src/seq/uvma_axi_ar_seq.sv | 8 ++ .../uvma_axi/src/seq/uvma_axi_aw_item.sv | 2 + .../uvma_axi/src/seq/uvma_axi_aw_seq.sv | 8 ++ .../uvma_axi/src/seq/uvma_axi_b_seq.sv | 4 +- .../uvma_axi/src/seq/uvma_axi_r_seq.sv | 3 +- .../uvma_axi/src/seq/uvma_axi_w_item.sv | 2 + .../uvma_axi/src/seq/uvma_axi_w_seq.sv | 33 ++++++- lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv | 11 +++ 13 files changed, 180 insertions(+), 9 deletions(-) diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv index 670843c40..9e9af3bbf 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_drv.sv @@ -70,9 +70,15 @@ class uvma_axi_ar_drv_c extends uvm_driver #(uvma_axi_ar_item_c); task drv_post_reset(); seq_item_port.get_next_item(ar_item); - this.slave_mp.slv_axi_cb.ar_ready <= 1'b1; + if(ar_item.ar_valid) begin + repeat (ar_item.ar_latency) begin + @(slave_mp.slv_axi_cb); + end + this.slave_mp.slv_axi_cb.ar_ready <= 1'b1; + end `uvm_info(get_type_name(), $sformatf("read address, response by ar_ready"), UVM_LOW) @(slave_mp.slv_axi_cb); + this.slave_mp.slv_axi_cb.ar_ready <= 1'b0; seq_item_port.item_done(); endtask: drv_post_reset diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv index 515959530..815b68184 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_drv.sv @@ -84,7 +84,14 @@ task uvma_axi_aw_drv_c::drv_post_reset(); `uvm_info(get_type_name(), $sformatf("write address driver start"), UVM_LOW) seq_item_port.get_next_item(aw_item); - this.slave_mp.slv_axi_cb.aw_ready <= 1'b1; + this.slave_mp.slv_axi_cb.aw_ready <= 1'b0; + + if(aw_item.aw_valid) begin + repeat (aw_item.aw_latency) begin + @(slave_mp.slv_axi_cb); + end + this.slave_mp.slv_axi_cb.aw_ready <= 1'b1; + end @(slave_mp.slv_axi_cb); seq_item_port.item_done(); diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv index 1b205d39d..95cb3ff44 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_drv.sv @@ -94,7 +94,7 @@ task uvma_axi_w_drv_c::drv_post_reset(); seq_item_port.get_next_item(w_item); `uvm_info(get_type_name(), $sformatf("write data driver start"), UVM_LOW) - this.slave_mp.slv_axi_cb.w_ready <= 1'b1; + this.slave_mp.slv_axi_cb.w_ready <= w_item.w_ready; @(slave_mp.slv_axi_cb); seq_item_port.item_done(); diff --git a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv index 0f4e6ac16..033a56682 100644 --- a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv +++ b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv @@ -15,18 +15,61 @@ class uvma_axi_cfg_c extends uvm_object; rand uvm_active_passive_enum is_active; + rand uvma_axi_drv_slv_mode_enum drv_slv_mode; + rand uvma_axi_drv_slv_err_mode_enum drv_slv_err_mode; + rand int unsigned drv_slv_fixed_latency; + rand int unsigned drv_slv_random_latency_min; + rand int unsigned drv_slv_random_latency_max; + + rand int unsigned drv_slv_err_ok; + rand int unsigned drv_slv_err_dec; + rand int unsigned drv_slv_err_slv; + rand bit drv_slv_err_one_shot_mode; + rand bit drv_slv_err_one_shot_flag; + bit directed_slv_err_valid; + bit[1:0] drv_slv_fixed_resp = 2'b10; `uvm_object_utils_begin(uvma_axi_cfg_c) `uvm_field_enum(uvm_active_passive_enum, is_active, UVM_DEFAULT); + `uvm_field_int (directed_slv_err_valid, UVM_DEFAULT) + `uvm_field_int (drv_slv_fixed_latency, UVM_DEFAULT) + `uvm_field_int (drv_slv_random_latency_min, UVM_DEFAULT) + `uvm_field_int (drv_slv_random_latency_max, UVM_DEFAULT) + `uvm_field_int (drv_slv_err_one_shot_mode, UVM_DEFAULT) + `uvm_field_int (drv_slv_err_one_shot_flag, UVM_DEFAULT) + `uvm_field_int (drv_slv_err_ok, UVM_DEFAULT | UVM_DEC) + `uvm_field_int (drv_slv_err_dec, UVM_DEFAULT | UVM_DEC) + `uvm_field_int (drv_slv_err_slv, UVM_DEFAULT | UVM_DEC) + `uvm_field_int (drv_slv_fixed_resp, UVM_DEFAULT | UVM_DEC) + `uvm_field_enum(uvma_axi_drv_slv_mode_enum, drv_slv_mode, UVM_DEFAULT) + `uvm_field_enum(uvma_axi_drv_slv_err_mode_enum, drv_slv_err_mode, UVM_DEFAULT) `uvm_object_utils_end constraint defaults_config { soft is_active == UVM_ACTIVE; + soft drv_slv_err_one_shot_mode == 0; + soft drv_slv_mode == UVMA_AXI_DRV_SLV_MODE_RANDOM_LATENCY; + soft drv_slv_fixed_latency == 3; + soft drv_slv_random_latency_min == 0; + soft drv_slv_random_latency_max == 4; + soft directed_slv_err_valid == 0; + soft drv_slv_err_mode == UVMA_AXI_DRV_SLV_ERR_MODE_RANDOM; } + constraint err_wgts_cons { + // Keep the weights for errors within some bounds + drv_slv_err_ok inside {[0:1000]}; + drv_slv_err_dec inside {[0:1000]}; + drv_slv_err_slv inside {[0:1000]}; + } + extern function new(string name = "uvma_axi_cfg"); + extern function int unsigned calc_random_latency(); + + extern function bit[1:0] random_err(); + endclass : uvma_axi_cfg_c @@ -36,4 +79,58 @@ function uvma_axi_cfg_c::new(string name = "uvma_axi_cfg"); endfunction : new +function int unsigned uvma_axi_cfg_c::calc_random_latency(); + int unsigned effective_latency; + + case (drv_slv_mode) + UVMA_AXI_DRV_SLV_MODE_CONSTANT : effective_latency = 0; + UVMA_AXI_DRV_SLV_MODE_FIXED_LATENCY : effective_latency = drv_slv_fixed_latency; + UVMA_AXI_DRV_SLV_MODE_RANDOM_LATENCY: begin + effective_latency = $urandom_range(drv_slv_random_latency_min, drv_slv_random_latency_max); + end + endcase + + return effective_latency; + +endfunction : calc_random_latency + +function bit[1:0] uvma_axi_cfg_c::random_err(); + + bit[1:0] err; + + // If we are in "one-shot" mode and have already calculated an error, + // then skip any new errors (until the code resets the flag) + if (drv_slv_err_one_shot_mode && drv_slv_err_one_shot_flag) begin + return 0; + end + + // Check for a directed error reponse first + if (directed_slv_err_valid) begin + + if (drv_slv_err_one_shot_mode) begin + drv_slv_err_one_shot_flag = 1; + end + + return drv_slv_fixed_resp; + end + + case (drv_slv_err_mode) + UVMA_AXI_DRV_SLV_ERR_MODE_OK : err = 2'b00; + UVMA_AXI_DRV_SLV_ERR_MODE_RANDOM : begin + randcase + drv_slv_err_ok : err = 2'b00; + drv_slv_err_dec: err = 2'b11; + drv_slv_err_slv: err = 2'b10; + endcase + end + endcase + + if (err != 0 && drv_slv_err_one_shot_mode) begin + drv_slv_err_one_shot_flag = 1; + end + + return err; + +endfunction : random_err + `endif //__UVMA_AXI_CFG_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv index e4a2baec8..3f740b051 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_item.sv @@ -25,6 +25,7 @@ class uvma_axi_ar_item_c extends uvm_sequence_item; rand logic ar_valid; rand logic ar_ready; rand logic ar_lock; + int ar_latency; `uvm_object_utils_begin(uvma_axi_ar_item_c) `uvm_field_int(ar_id, UVM_ALL_ON | UVM_NOPACK); @@ -36,6 +37,7 @@ class uvma_axi_ar_item_c extends uvm_sequence_item; `uvm_field_int(ar_valid, UVM_ALL_ON | UVM_NOPACK); `uvm_field_int(ar_ready, UVM_ALL_ON | UVM_NOPACK); `uvm_field_int(ar_lock, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_latency, UVM_DEFAULT + UVM_DEC + UVM_NOCOMPARE); `uvm_object_utils_end function new(string name = "uvma_axi_ar_item_c"); diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv index d4fa0c652..3bfdcfff8 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_ar_seq.sv @@ -25,6 +25,7 @@ class uvma_axi_ar_seq_c extends uvm_sequence#(uvma_axi_ar_item_c); uvma_axi_ar_item_c req_item; extern function new(string name = ""); + extern function void add_latencies(uvma_axi_ar_item_c master_req); extern task body(); endclass : uvma_axi_ar_seq_c @@ -34,6 +35,12 @@ function uvma_axi_ar_seq_c::new(string name = ""); super.new(name); endfunction : new +function void uvma_axi_ar_seq_c::add_latencies(uvma_axi_ar_item_c master_req); + + master_req.ar_latency = cfg.calc_random_latency(); + +endfunction : add_latencies + task uvma_axi_ar_seq_c::body(); forever begin cfg = p_sequencer.cfg; @@ -44,6 +51,7 @@ task uvma_axi_ar_seq_c::body(); start_item(req_item); `uvm_info(get_type_name(), "READ ADDRESS sequence starting", UVM_LOW) + add_latencies(req_item); finish_item(req_item); end `uvm_info(get_type_name(), "Default sequence completed", UVM_LOW) diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv index a6b757bdc..86b45ffa3 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_item.sv @@ -30,6 +30,7 @@ class uvma_axi_aw_item_c extends uvm_sequence_item; rand logic [3:0] aw_qos; rand logic [3:0] aw_region; rand logic [5:0] aw_atop; + int aw_latency; `uvm_object_utils_begin(uvma_axi_aw_item_c) `uvm_field_int(aw_id, UVM_ALL_ON | UVM_NOPACK); @@ -46,6 +47,7 @@ class uvma_axi_aw_item_c extends uvm_sequence_item; `uvm_field_int(aw_qos, UVM_ALL_ON | UVM_NOPACK); `uvm_field_int(aw_region, UVM_ALL_ON | UVM_NOPACK); `uvm_field_int(aw_atop, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_latency, UVM_DEFAULT + UVM_DEC + UVM_NOCOMPARE); `uvm_object_utils_end function new(string name = "uvma_axi_aw_item_c"); diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv index 04a0e6257..976b0be1e 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_aw_seq.sv @@ -26,6 +26,7 @@ class uvma_axi_aw_seq_c extends uvm_sequence#(uvma_axi_aw_item_c); uvma_axi_aw_item_c req_item; extern function new(string name = ""); + extern function void add_latencies(uvma_axi_aw_item_c master_req); extern task body(); endclass : uvma_axi_aw_seq_c @@ -35,6 +36,12 @@ function uvma_axi_aw_seq_c::new(string name = ""); super.new(name); endfunction : new +function void uvma_axi_aw_seq_c::add_latencies(uvma_axi_aw_item_c master_req); + + master_req.aw_latency = cfg.calc_random_latency(); + +endfunction : add_latencies + task uvma_axi_aw_seq_c::body(); forever begin cfg = p_sequencer.cfg ; @@ -45,6 +52,7 @@ task uvma_axi_aw_seq_c::body(); start_item(req_item); `uvm_info(get_type_name(), "WRITE ADDRESS sequence starting", UVM_LOW) + add_latencies(req_item); finish_item(req_item); end diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv index 8edb9d0fc..907acbdb2 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_b_seq.sv @@ -36,6 +36,7 @@ class uvma_axi_b_seq_c extends uvm_sequence#(uvma_axi_b_item_c); int first_req = 0; int selected_id; int enable_change_id = 1; + bit[1:0] inject_error; extern function new(string name = ""); extern function void create_item(); @@ -131,6 +132,7 @@ task uvma_axi_b_seq_c::body(); if(enable_change_id == 1) begin selected_id = check_tab(status); + inject_error = cfg.random_err(); end `uvm_info(get_type_name(), $sformatf("selected id = %d", selected_id), UVM_HIGH) @@ -139,7 +141,7 @@ task uvma_axi_b_seq_c::body(); `uvm_info(get_type_name(), "send resp", UVM_HIGH) b_resp_item.b_id = req_requette[selected_id][0].aw_id; - b_resp_item.b_resp = 0; + b_resp_item.b_resp = inject_error; b_resp_item.b_valid = 1; b_resp_item.b_user = 0; diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv index 2cf7563ca..c1684189f 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_r_seq.sv @@ -104,6 +104,7 @@ task uvma_axi_r_seq_c::body(); if(enable_change_id == 1) begin selected_id = check_tab(status); + inject_error = cfg.random_err(); r_latency = -1; end @@ -131,7 +132,7 @@ task uvma_axi_r_seq_c::body(); end selected_id = check_tab(status); - inject_error = 1'b0; + inject_error = cfg.random_err(); r_latency = -1; if(selected_id == -1) begin diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv index 76e23da1d..1424838ba 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_item.sv @@ -21,6 +21,7 @@ class uvma_axi_w_item_c extends uvm_sequence_item; rand logic w_user; rand logic w_valid; rand logic w_ready; + int w_latency; `uvm_object_param_utils_begin(uvma_axi_w_item_c) `uvm_field_int(w_strb, UVM_ALL_ON | UVM_NOPACK); @@ -29,6 +30,7 @@ class uvma_axi_w_item_c extends uvm_sequence_item; `uvm_field_int(w_user, UVM_ALL_ON | UVM_NOPACK); `uvm_field_int(w_valid, UVM_ALL_ON | UVM_NOPACK); `uvm_field_int(w_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_latency, UVM_DEFAULT + UVM_DEC + UVM_NOCOMPARE); `uvm_object_utils_end function new(string name = "uvma_axi_w_item_c"); diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv index e5c9489c7..5aba1d7c3 100644 --- a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_w_seq.sv @@ -6,6 +6,7 @@ // You may obtain a copy of the License at https://solderpad.org/licenses/ // // Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi //============================================================================= // Description: Sequence for agent axi_w @@ -46,6 +47,12 @@ function uvma_axi_w_seq_c::new(string name = ""); super.new(name); endfunction : new +function void uvma_axi_w_seq_c::add_latencies(uvma_axi_w_item_c master_req); + + master_req.w_latency = cfg.calc_random_latency(); + +endfunction : add_latencies + task uvma_axi_w_seq_c::body(); aw_req_item = uvma_axi_aw_item_c::type_id::create("aw_req_item"); @@ -91,10 +98,28 @@ task uvma_axi_w_seq_c::body(); `uvm_info(get_type_name(), $sformatf("req_requette size = %d", req_requette.size()), UVM_LOW) if(w_req_item.w_valid) begin - write_data_req = new[write_data_req.size() + 1] (write_data_req); - write_data_req[write_data_req.size() - 1] = new w_req_item; - write_status = 1; - + if(latency == 0) begin + add_latencies(w_req_item); + w_ready_latency = w_req_item.w_latency; + end + + w_req_item.w_ready = 0; + + if(latency == w_ready_latency) begin + w_req_item.w_ready = 1; + latency = 0; + end else begin + latency++; + end + + if(w_req_item.w_ready) begin + write_data_req = new[write_data_req.size() + 1] (write_data_req); + write_data_req[write_data_req.size() - 1] = new w_req_item; + write_status = 1; + end + + end else begin + w_req_item.w_ready = 0; end `uvm_info(get_type_name(), $sformatf("status = %d et write_status = %d", status, write_status), UVM_LOW) diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv index 0b996ce01..dea9a4f2b 100644 --- a/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_tdefs.sv @@ -18,4 +18,15 @@ UVMA_AXI_RESET_STATE_POST_RESET } uvma_axi_reset_state_enum; + typedef enum { + UVMA_AXI_DRV_SLV_MODE_CONSTANT , + UVMA_AXI_DRV_SLV_MODE_FIXED_LATENCY , + UVMA_AXI_DRV_SLV_MODE_RANDOM_LATENCY + } uvma_axi_drv_slv_mode_enum; + + typedef enum { + UVMA_AXI_DRV_SLV_ERR_MODE_OK, + UVMA_AXI_DRV_SLV_ERR_MODE_RANDOM + } uvma_axi_drv_slv_err_mode_enum; + `endif // __UVMA_AXI_TDEFS_SV__ From 3b6d8fd077d718d832ed6f052a1bb14a83310477 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Thu, 8 Dec 2022 10:22:59 +0100 Subject: [PATCH 041/183] axi_agent: add assertion modules Signed-off-by: Alae Eddine Ez zejjari --- .../uvma_axi/src/uvma_axi_ar_assert.sv | 316 +++++++++++++++++ .../uvma_axi/src/uvma_axi_aw_assert.sv | 318 ++++++++++++++++++ .../uvma_axi/src/uvma_axi_b_assert.sv | 109 ++++++ lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv | 5 + .../uvma_axi/src/uvma_axi_r_assert.sv | 141 ++++++++ .../uvma_axi/src/uvma_axi_w_assert.sv | 125 +++++++ 6 files changed, 1014 insertions(+) create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_ar_assert.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_aw_assert.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_b_assert.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_r_assert.sv create mode 100644 lib/uvm_agents/uvma_axi/src/uvma_axi_w_assert.sv diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_ar_assert.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_ar_assert.sv new file mode 100644 index 000000000..6fe7157d1 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_ar_assert.sv @@ -0,0 +1,316 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +// *************************** READ ADDRESS CHANNEL ************************** // + +module uvma_axi_ar_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + + +// *************************** Check if control information Signals are not equal to X or Z when ARVALID is HIGH (Section A3.2.2) ************************** // + + property AXI4_ARID_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_id)); + endproperty + + property AXI4_ARADDR_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_addr)); + endproperty + + property AXI4_ARLEN_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_len)); + endproperty + + property AXI4_ARSIZE_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_size)); + endproperty + + property AXI4_ARBURST_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_burst)); + endproperty + + property AXI4_ARLOCK_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_lock)); + endproperty + + property AXI4_ARCACHE_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_cache)); + endproperty + + property AXI4_ARPROT_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_prot)); + endproperty + + property AXI4_ARUSER_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_user)); + endproperty + + property AXI4_ARQOS_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_qos)); + endproperty + + property AXI4_ARREGION_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!$isunknown(axi_assert.psv_axi_cb.ar_region)); + endproperty + + // A value of X on ARVALID is not permitted when not in reset (Section A3.1.2) + property AXI4_ARVALID_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.ar_valid)); + endproperty + + // A value of X on ARREADY is not permitted when not in reset (Section A3.1.2) + property AXI4_ARREADY_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.ar_ready)); + endproperty + +// *************************** Check if control information Signals are stable when ARVALID is HIGH (Section A3.2.1) ************************** // + + property AXI4_ARID_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_id))); + endproperty + + property AXI4_ARADDR_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_addr))); + endproperty + + property AXI4_ARLEN_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_len))); + endproperty + + property AXI4_ARSIZE_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_size))); + endproperty + + property AXI4_ARBURST_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_burst))); + endproperty + + property AXI4_ARLOCK_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_lock))); + endproperty + + property AXI4_ARCACHE_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_cache))); + endproperty + + property AXI4_ARPROT_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_prot))); + endproperty + + property AXI4_ARUSER_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_user))); + endproperty + + property AXI4_ARQOS_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_qos))); + endproperty + + property AXI4_ARREGION_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (!axi_assert.psv_axi_cb.ar_ready |=> ($stable(axi_assert.psv_axi_cb.ar_region))); + endproperty + + // Check if, Once asserted, ar_valid must remain asserted until ar_ready is HIGH (Section A3.2.1) + property AXI4_AR_VALID_READY ; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (axi_assert.psv_axi_cb.ar_valid throughout (axi_assert.psv_axi_cb.ar_ready [->1])); + endproperty + + // check if a read transaction with burst type WRAP has an aligned address (Section A3.4.1) + property AXI_ARADDR_WRAP_ALIGN; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.ar_valid && axi_assert.psv_axi_cb.ar_burst == 2'b10) |-> !((axi_assert.psv_axi_cb.ar_addr) % (2**axi_assert.psv_axi_cb.ar_size)); + endproperty + + // check if The size of a read transfer does not exceed the width of the data interface (Section A3.4.1) + property AXI_ERRM_ARSIZE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (8*(2**axi_assert.psv_axi_cb.ar_size) <= `UVMA_AXI_DATA_MAX_WIDTH); + endproperty + + // check if burst crosses 4KB boundaries (Section A3.4.1) + property AXI4_ERRM_ARADDR_BOUNDARY; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (((axi_assert.psv_axi_cb.ar_addr + (axi_assert.psv_axi_cb.ar_len + 1)*(2**axi_assert.psv_axi_cb.ar_size)) % 4096) > (axi_assert.psv_axi_cb.ar_addr % 4096)) || !((axi_assert.psv_axi_cb.ar_addr+(axi_assert.psv_axi_cb.ar_len + 1) * (2**axi_assert.psv_axi_cb.ar_size)) % 4096) ; + endproperty + + // Check if the burst length equal to 2, 4, 8, or 16, for wrapping bursts (Section A3.4.1) + property AXI_ARLEN_WRAPP_BURST; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.ar_valid && axi_assert.psv_axi_cb.ar_burst == 2'b10) |-> (axi_assert.psv_axi_cb.ar_len == 1) || (axi_assert.psv_axi_cb.ar_len == 3) || (axi_assert.psv_axi_cb.ar_len == 7) || (axi_assert.psv_axi_cb.ar_len == 15); + endproperty + + // Check if ar_burst can’t be 2’b11 (Table A3-3) + property AXI4_AR_BURST_CANT_2b11; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_valid |-> (axi_assert.psv_axi_cb.ar_burst != 2'b11); + endproperty + + // Check if ARVALID is LOW for the first cycle after ARESETn goes HIGH (Figure A3-1) + property AXI4_ARVALID_RESET; + @(posedge clk) $rose(rst_n) |=> !(axi_assert.psv_axi_cb.ar_valid); + endproperty + + // Check if the length of an exclusive access transaction don't pass 16 beats (Section A7.2.4) + property AXI4_ARLEN_LOCK; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.ar_lock |-> (signed' (axi_assert.psv_axi_cb.ar_len)) <= 16; + endproperty + + // Check if ARCACHE[3:2] are LOW, When ARVALID is HIGH and ARCACHE[1] is LOW (Table A4-5) + property AXI4_ARCACHE_LOW; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.ar_valid) && !(axi_assert.psv_axi_cb.ar_cache[1]) |-> !(axi_assert.psv_axi_cb.ar_cache[3:2]); + endproperty + + // Check if a transactions of burst type FIXED don't have a length greater than 16 beats (Section A3.4.1) + property AXI4_ARLEN_FIXED; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.ar_burst == 2'b00) |-> (axi_assert.psv_axi_cb.ar_len <= 15); + endproperty + +/********************************************** Assert Property ******************************************************/ + + ar_valid_ready : assert property (AXI4_AR_VALID_READY) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AR_VALID_READY"); + + arlen_wrapp_burst : assert property (AXI_ARLEN_WRAPP_BURST) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI_ARLEN_WRAPP_BURST"); + + araddr_wrap_align : assert property (AXI_ARADDR_WRAP_ALIGN) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI_ARADDR_WRAP_ALIGN"); + + assert_arsize : assert property (AXI_ERRM_ARSIZE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI_ERRM_ARSIZE"); + + ar_burst_cant_2b11 : assert property (AXI4_AR_BURST_CANT_2b11) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AR_BURST_CANT_2b11"); + + araddr_boundary : assert property (AXI4_ERRM_ARADDR_BOUNDARY) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ERRM_ARADDR_BOUNDARY"); + + arvalid_reset : assert property (AXI4_ARVALID_RESET) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARVALID_RESET"); + + arlen_lock : assert property (AXI4_ARLEN_LOCK) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARLEN_LOCK"); + + arcahce_low : assert property (AXI4_ARCACHE_LOW) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARCACHE_LOW"); + + arlen_fixed : assert property (AXI4_ARLEN_FIXED) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARLEN_FIXED"); + + arid_x : assert property (AXI4_ARID_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARID_X"); + + araddr_x : assert property (AXI4_ARADDR_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARADDR_X"); + + arlen_x : assert property (AXI4_ARLEN_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARLEN_X"); + + arsize_x : assert property (AXI4_ARSIZE_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARSIZE_X"); + + arburst_x : assert property (AXI4_ARBURST_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARBURST_X"); + + arlock_x : assert property (AXI4_ARLOCK_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARLOCK_X"); + + arcache_x : assert property (AXI4_ARCACHE_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARCACHE_X"); + + arprot_x : assert property (AXI4_ARPROT_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARPROT_X"); + + arqos_x : assert property (AXI4_ARQOS_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARQOS_X"); + + arregion_x : assert property (AXI4_ARREGION_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARREGION_X"); + + arvalid_x : assert property (AXI4_ARVALID_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARVALID_X"); + + arready_x : assert property (AXI4_ARREADY_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARREADY_X"); + + arid_stable : assert property (AXI4_ARID_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARID_STABLE"); + + araddr_stable : assert property (AXI4_ARADDR_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARADDR_STABLE"); + + arlen_stable : assert property (AXI4_ARLEN_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARLEN_STABLE"); + + arsize_stable : assert property (AXI4_ARSIZE_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARSIZE_STABLE"); + + arburst_stable : assert property (AXI4_ARBURST_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARBURST_STABLE"); + + arlock_stable : assert property (AXI4_ARLOCK_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARLOCK_STABLE"); + + arcache_stable : assert property (AXI4_ARCACHE_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARCACHE_STABLE"); + + arprot_stable : assert property (AXI4_ARPROT_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARPROT_STABLE"); + + aruser_stable : assert property (AXI4_ARUSER_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARUSER_STABLE"); + + arqos_stable : assert property (AXI4_ARQOS_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARQOS_STABLE"); + + arregion_stable : assert property (AXI4_ARREGION_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ARREGION_STABLE"); + +/********************************************** Cover Property ******************************************************/ + + cov_ar_valid_ar_ready : cover property(AXI4_AR_VALID_READY); + + cov_araddr_wrap_align : cover property(AXI_ARADDR_WRAP_ALIGN); + + cov_arlen_wrapp_burst : cover property(AXI_ARLEN_WRAPP_BURST); + + cov_arsize : cover property(AXI_ERRM_ARSIZE); + + cov_arvalid_reset : cover property(AXI4_ARVALID_RESET); + + cov_ar_burst_cant_2b11 : cover property(AXI4_AR_BURST_CANT_2b11); + + cov_errm_ARaddr_boundary : cover property(AXI4_ERRM_ARADDR_BOUNDARY); + + cov_arlen_lock : cover property(AXI4_ARLEN_LOCK); + + cov_arcache_low : cover property(AXI4_ARCACHE_LOW); + + cov_arlen_fixed : cover property(AXI4_ARLEN_FIXED); + + cov_arid_stable : cover property(AXI4_ARID_STABLE); + + cov_araddr_stable : cover property(AXI4_ARADDR_STABLE); + + cov_arlen_stable : cover property(AXI4_ARLEN_STABLE); + + cov_arsize_stable : cover property(AXI4_ARSIZE_STABLE); + + cov_arburst_stable : cover property(AXI4_ARBURST_STABLE); + + cov_arlock_stable : cover property(AXI4_ARLOCK_STABLE); + + cov_arcache_stable : cover property(AXI4_ARCACHE_STABLE); + + cov_arprot_stable : cover property(AXI4_ARPROT_STABLE); + + cov_aruser_stable : cover property(AXI4_ARUSER_STABLE); + + cov_arqos_stable : cover property(AXI4_ARQOS_STABLE); + + cov_arregion_stable : cover property(AXI4_ARREGION_STABLE); + + +endmodule : uvma_axi_ar_assert diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_aw_assert.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_aw_assert.sv new file mode 100644 index 000000000..8bab3da9c --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_aw_assert.sv @@ -0,0 +1,318 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +// ***************************WRITE ADDRESS CHANNEL ************************** // + +module uvma_axi_aw_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + +// *************************** Check if control information Signals are not equal to X or Z when WVALID is HIGH (Section A3.2.2) ************************** // + + property AXI4_AWID_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_id)); + endproperty + + property AXI4_AWADDR_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_addr)); + endproperty + + property AXI4_AWLEN_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_len)); + endproperty + + property AXI4_AWSIZE_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_size)); + endproperty + + property AXI4_AWBURST_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_burst)); + endproperty + + property AXI4_AWLOCK_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_lock)); + endproperty + + property AXI4_AWCACHE_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_cache)); + endproperty + + property AXI4_AWPROT_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_prot)); + endproperty + + property AXI4_AWUSER_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_user)); + endproperty + + property AXI4_AWQOS_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_qos)); + endproperty + + property AXI4_AWREGION_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!$isunknown(axi_assert.psv_axi_cb.aw_region)); + endproperty + + // A value of X on AWVALID is not permitted when not in reset (Section A3.1.2) + property AXI4_AWVALID_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.aw_valid)); + endproperty + + // A value of X on AWREADY is not permitted when not in reset (Section A3.1.2) + property AXI4_AWREADY_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.aw_ready)); + endproperty + +// *************************** Check if control information Signals are stable when AWVALID is HIGH (Section A3.2.1) ************************** // + + property AXI4_AWID_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_id))); + endproperty + + property AXI4_AWADDR_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_addr))); + endproperty + + property AXI4_AWLEN_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_len))); + endproperty + + property AXI4_AWSIZE_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_size))); + endproperty + + property AXI4_AWBURST_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_burst))); + endproperty + + property AXI4_AWLOCK_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_lock))); + endproperty + + property AXI4_AWCACHE_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_cache))); + endproperty + + property AXI4_AWPROT_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_prot))); + endproperty + + property AXI4_AWUSER_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_user))); + endproperty + + property AXI4_AWQOS_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_qos))); + endproperty + + property AXI4_AWREGION_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (!axi_assert.psv_axi_cb.aw_ready |=> ($stable(axi_assert.psv_axi_cb.aw_region))); + endproperty + + // Check if, Once asserted, aw_valid must remain asserted until aw_ready is HIGH (Section A3.2.1) + property AXI4_AW_VALID_READY; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> ( axi_assert.psv_axi_cb.aw_valid throughout (axi_assert.psv_axi_cb.aw_ready [->1])); + endproperty + + // check if a write transaction with burst type WRAP has an aligned address (Section A3.4.1) + property AXI_AWADDR_WRAP_ALIGN; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.aw_valid && axi_assert.psv_axi_cb.aw_burst == 2'b10) |-> !((axi_assert.psv_axi_cb.aw_addr) % (2**axi_assert.psv_axi_cb.aw_size)); + endproperty + + // check if The size of a write transfer does not exceed the width of the data interface (Section A3.4.1) + property AXI_ERRM_AWSIZE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (8 * (2**axi_assert.psv_axi_cb.aw_size) <= `UVMA_AXI_DATA_MAX_WIDTH); + endproperty + + // check if burst crosses 4KB boundaries (Section A3.4.1) + property AXI4_ERRM_AWADDR_BOUNDARY; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (((axi_assert.psv_axi_cb.aw_addr + (axi_assert.psv_axi_cb.aw_len + 1) * (2**axi_assert.psv_axi_cb.aw_size)) % 4096) > (axi_assert.psv_axi_cb.aw_addr % 4096)) || !((axi_assert.psv_axi_cb.aw_addr + (axi_assert.psv_axi_cb.aw_len + 1) * (2**axi_assert.psv_axi_cb.aw_size)) % 4096); + endproperty + + // Check if the burst length equal to 2, 4, 8, or 16, for wrapping bursts (Section A3.4.1) + property AXI_AWLEN_WRAPP_BURST; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.aw_valid && axi_assert.psv_axi_cb.aw_burst == 2'b10) |-> (axi_assert.psv_axi_cb.aw_len == 1) || (axi_assert.psv_axi_cb.aw_len == 3) || (axi_assert.psv_axi_cb.aw_len == 7) || (axi_assert.psv_axi_cb.aw_len == 15); + endproperty + + // Check if aw_burst can’t be 2’b11 (Table A3-3) + property AXI4_AW_BURST_CANT_2b11; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_valid |-> (axi_assert.psv_axi_cb.aw_burst != 2'b11); + endproperty + + // Check if AWVALID is LOW for the first cycle after ARESETn goes HIGH (Figure A3-1) + property AXI4_AWVALID_RESET; + @(posedge clk) $rose(rst_n) |=> !(axi_assert.psv_axi_cb.aw_valid); + endproperty + + // Check if the length of an exclusive access transaction don't pass 16 beats (Section A7.2.4) + property AXI4_AWLEN_LOCK; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.aw_lock |-> (signed'(axi_assert.psv_axi_cb.aw_len)) <= 16; + endproperty + + // Check if AWCACHE[3:2] are LOW, When AWVALID is HIGH and AWCACHE[1] is LOW (Table A4-5) + property AXI4_AWCACHE_LOW; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.aw_valid) && !(axi_assert.psv_axi_cb.aw_cache[1]) |-> !(axi_assert.psv_axi_cb.aw_cache[3:2]); + endproperty + + // Check if a transactions of burst type FIXED don't have a length greater than 16 beats (Section A3.4.1) + property AXI4_AWLEN_FIXED; + @(posedge clk) disable iff (!rst_n) (axi_assert.psv_axi_cb.aw_burst == 2'b00) |-> (axi_assert.psv_axi_cb.aw_len <= 15); + endproperty + +/********************************************** Assert Property ******************************************************/ + + aw_valid_aw_ready : assert property (AXI4_AW_VALID_READY) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AW_VALID_READY"); + + awaddr_wrap_align : assert property (AXI_AWADDR_WRAP_ALIGN) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI_AWADDR_WRAP_ALIGN"); + + assert_awsize : assert property (AXI_ERRM_AWSIZE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI_ERRM_AWSIZE"); + + awlen_wrapp_burst : assert property (AXI_AWLEN_WRAPP_BURST) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI_AWLEN_WRAPP_BURST"); + + aw_burst_cant_2b11 : assert property (AXI4_AW_BURST_CANT_2b11) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AW_BURST_CANT_2b11"); + + errm_awaddr_boundary : assert property (AXI4_ERRM_AWADDR_BOUNDARY) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_ERRM_AWADDR_BOUNDARY"); + + awvalid_reset : assert property (AXI4_AWVALID_RESET) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWVALID_RESET"); + + awlen_lock : assert property (AXI4_AWLEN_LOCK) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWLEN_LOCK"); + + awcahce_low : assert property (AXI4_AWCACHE_LOW) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWCACHE_LOW"); + + awlen_fixed : assert property (AXI4_AWLEN_FIXED) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWLEN_FIXED"); + + awid_x : assert property (AXI4_AWID_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWID_X"); + + awaddr_x : assert property (AXI4_AWADDR_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWADDR_X"); + + awlen_x : assert property (AXI4_AWLEN_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWLEN_X"); + + awsize_x : assert property (AXI4_AWSIZE_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWSIZE_X"); + + awburst_x : assert property (AXI4_AWBURST_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWBURST_X"); + + awlock_x : assert property (AXI4_AWLOCK_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWLOCK_X"); + + awcache_x : assert property (AXI4_AWCACHE_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWCACHE_X"); + + awprot_x : assert property (AXI4_AWPROT_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWPROT_X"); + + awuser_x : assert property (AXI4_AWUSER_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWUSER_X"); + + awqos_x : assert property (AXI4_AWQOS_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWQOS_X"); + + awregion_x : assert property (AXI4_AWREGION_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWREGION_X"); + + awvalid_x : assert property (AXI4_AWVALID_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWVALID_X"); + + awready_x : assert property (AXI4_AWREADY_X) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWREADY_X"); + + awid_stable : assert property (AXI4_AWID_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWID_STABLE"); + + awaddr_stable : assert property (AXI4_AWADDR_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWADDR_STABLE"); + + awlen_stable : assert property (AXI4_AWLEN_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWLEN_STABLE"); + + awsize_stable : assert property (AXI4_AWSIZE_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWSIZE_STABLE"); + + awburst_stable : assert property (AXI4_AWBURST_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWBURST_STABLE"); + + awlock_stable : assert property (AXI4_AWLOCK_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWLOCK_STABLE"); + + awcache_stable : assert property (AXI4_AWCACHE_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWCACHE_STABLE"); + + awprot_stable : assert property (AXI4_AWPROT_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWPROT_STABLE"); + + awuser_stable : assert property (AXI4_AWUSER_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWUSER_STABLE"); + + awqos_stable : assert property (AXI4_AWQOS_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWQOS_STABLE"); + + awregion_stable : assert property (AXI4_AWREGION_STABLE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_AWREGION_STABLE"); + +/********************************************** Cover Property ******************************************************/ + + cov_aw_valid_aw_ready : cover property(AXI4_AW_VALID_READY); + + cov_awaddr_wrap_align : cover property(AXI_AWADDR_WRAP_ALIGN); + + cov_awsize : cover property(AXI_ERRM_AWSIZE); + + cov_awvalid_reset : cover property(AXI4_AWVALID_RESET); + + cov_awlen_wrapp_burst : cover property(AXI_AWLEN_WRAPP_BURST); + + cov_aw_burst_cant_2b11 : cover property(AXI4_AW_BURST_CANT_2b11); + + cov_errm_awaddr_boundary : cover property(AXI4_ERRM_AWADDR_BOUNDARY); + + cov_awlen_lock : cover property(AXI4_AWLEN_LOCK); + + cov_awcache_low : cover property(AXI4_AWCACHE_LOW); + + cov_awlen_fixed : cover property(AXI4_AWLEN_FIXED); + + cov_awid_stable : cover property(AXI4_AWID_STABLE); + + cov_awaddr_stable : cover property(AXI4_AWADDR_STABLE); + + cov_awlen_stable : cover property(AXI4_AWLEN_STABLE); + + cov_awsize_stable : cover property(AXI4_AWSIZE_STABLE); + + cov_awburst_stable : cover property(AXI4_AWBURST_STABLE); + + cov_awlock_stable : cover property(AXI4_AWLOCK_STABLE); + + cov_awcache_stable : cover property(AXI4_AWCACHE_STABLE); + + cov_awprot_stable : cover property(AXI4_AWPROT_STABLE); + + cov_awuser_stable : cover property(AXI4_AWUSER_STABLE); + + cov_awqos_stable : cover property(AXI4_AWQOS_STABLE); + + cov_awregion_stable : cover property(AXI4_AWREGION_STABLE); + + +endmodule : uvma_axi_aw_assert diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_b_assert.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_b_assert.sv new file mode 100644 index 000000000..381fd3ae9 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_b_assert.sv @@ -0,0 +1,109 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +// *************************** Write response CHANNEL ************************** // + +module uvma_axi_b_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + +// *************************** Check if Write Response Signals are not equal to X or Z when WVALID is HIGH (Section A3.2.2) ************************** // + + property AXI4_BID_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> (!$isunknown(axi_assert.psv_axi_cb.b_id)); + endproperty + + property AXI4_BRESP_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> (!$isunknown(axi_assert.psv_axi_cb.b_resp)); + endproperty + + property AXI4_BUSER_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> (!$isunknown(axi_assert.psv_axi_cb.b_user)); + endproperty + + // A value of X on BVALID is not permitted when not in reset (Section A3.2.2) + property AXI4_BVALID_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.b_valid)); + endproperty + + // A value of X on BVALID is not permitted when not in reset (Section A3.1.2) + property AXI4_BREADY_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.b_ready)); + endproperty + +// *************************** Check if Write Response Signals are stable when AWVALID is HIGH (Section A3.2.1) ************************** // + + property AXI4_BID_STABLE ; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> (!axi_assert.psv_axi_cb.b_ready |=> ($stable(axi_assert.psv_axi_cb.b_id))); + endproperty + + property AXI4_BRESP_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> (!axi_assert.psv_axi_cb.b_ready |=> ($stable(axi_assert.psv_axi_cb.b_resp))); + endproperty + + property AXI4_BUSER_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> (!axi_assert.psv_axi_cb.b_ready |=> ($stable(axi_assert.psv_axi_cb.b_user))); + endproperty + + // Check if, Once asserted, r_valid must remain asserted until r_ready is HIGH (Section A3.2.2) + property AXI4_BVALID_STABLE ; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.b_valid |-> ( axi_assert.psv_axi_cb.b_valid throughout (axi_assert.psv_axi_cb.b_ready [->1])); + endproperty + + // Check if RVALID is LOW for the first cycle after ARESETn goes HIGH (Figure A3-1) + property AXI4_BVALID_RESET; + @(posedge clk) $rose(rst_n) |=> !(axi_assert.psv_axi_cb.b_valid); + endproperty + +/********************************************** Assert Property ******************************************************/ + + rvalid_reset : assert property (AXI4_BVALID_RESET) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BVALID_RESET"); + + bid_x : assert property (AXI4_BID_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BID_X"); + + bresp_x : assert property (AXI4_BRESP_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BRESP_X"); + + buser_x : assert property (AXI4_BUSER_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BUSER_X"); + + bvalid_x : assert property (AXI4_BVALID_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BVALID_X"); + + bready_x : assert property (AXI4_BREADY_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BREADY_X"); + + bvalid_stable : assert property (AXI4_BVALID_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BVALID_STABLE"); + + bid_stable : assert property (AXI4_BID_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BID_STABLE"); + + bresp_stable : assert property (AXI4_BRESP_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BRESP_STABLE"); + + buser_stable : assert property (AXI4_BUSER_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_BUSER_STABLE"); + +/********************************************** Cover Property ******************************************************/ + + cov_bvalid_reset : cover property(AXI4_BVALID_RESET); + + cov_bvalid_stable : cover property(AXI4_BVALID_STABLE); + + cov_bid_stable : cover property(AXI4_BID_STABLE); + + cov_bresp_stable : cover property(AXI4_BRESP_STABLE); + + cov_buser_stable : cover property(AXI4_BUSER_STABLE); + +endmodule : uvma_axi_b_assert diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv index b06dc1b7b..5941d1fc8 100644 --- a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv @@ -20,6 +20,11 @@ // Interfaces / Modules / Checkers `include "uvma_axi_intf.sv" +`include "uvma_axi_aw_assert.sv" +`include "uvma_axi_w_assert.sv" +`include "uvma_axi_ar_assert.sv" +`include "uvma_axi_r_assert.sv" +`include "uvma_axi_b_assert.sv" package uvma_axi_pkg; diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_r_assert.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_r_assert.sv new file mode 100644 index 000000000..c475f0429 --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_r_assert.sv @@ -0,0 +1,141 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +// *************************** READ DATA CHANNEL ************************** // + +module uvma_axi_r_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + +// *************************** Check if Read Signals are not equal X or Z when RVALID is HIGH (Section A3.2.2) ************************** // + + property AXI4_RID_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_id)); + endproperty + + property AXI4_RDATA_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_data)); + endproperty + + property AXI4_RRESP_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_resp)); + endproperty + + property AXI4_RLAST_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_last)); + endproperty + + property AXI4_RUSEr_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!$isunknown(axi_assert.psv_axi_cb.r_user)); + endproperty + +//A value of X on RVALID is not permitted when not in reset (Section A3.1.2) + property AXI4_RVALID_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.r_valid)); + endproperty + +//A value of X on RREADY is not permitted when not in reset (Section A3.1.2) + property AXI4_RREADY_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.r_ready)); + endproperty + +// *************************** Check if Read Signals are stable when AWVALID is HIGH (Section A3.2.1) ************************** // + property AXI4_RID_STABLE ; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_id))); + endproperty + + property AXI4_RDATA_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_data))); + endproperty + + property AXI4_RRESP_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_resp))); + endproperty + + property AXI4_RLAST_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_last))); + endproperty + + property AXI4_RUSER_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> (!axi_assert.psv_axi_cb.r_ready |=> ($stable(axi_assert.psv_axi_cb.r_user))); + endproperty + + // Check if, Once asserted, r_valid must remain asserted until r_ready is HIGH (Section A3.2.1) + property AXI4_RVALID_STABLE ; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.r_valid |-> ( axi_assert.psv_axi_cb.r_valid throughout (axi_assert.psv_axi_cb.r_ready [->1])); + endproperty + + // Check if RVALID is LOW for the first cycle after RESET goes HIGH (Figure A3-1) + property AXI4_RVALID_RESET; + @(posedge clk) $rose(rst_n) |=> !(axi_assert.psv_axi_cb.r_valid); + endproperty + +/********************************************** Assert Property ******************************************************/ + + rvalid_reset : assert property (AXI4_RVALID_RESET) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RVALID_RESET"); + + rid_x : assert property (AXI4_RID_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RID_X"); + + rdata_x : assert property (AXI4_RDATA_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RDATA_X"); + + rresp_x : assert property (AXI4_RRESP_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RRESP_X"); + + rlast_x : assert property (AXI4_RLAST_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RLAST_X"); + + rvalid_x : assert property (AXI4_RVALID_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RVALID_X"); + + rready_x : assert property (AXI4_RREADY_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RREADY_X"); + + rvalid_stable : assert property (AXI4_RVALID_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RVALID_STABLE"); + + rid_stable : assert property (AXI4_RID_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RID_STABLE"); + + rdata_stable : assert property (AXI4_RDATA_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RDATA_STABLE"); + + rresp_stable : assert property (AXI4_RRESP_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RRESP_STABLE"); + + rlast_stable : assert property (AXI4_RLAST_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RLAST_STABLE"); + + ruser_stable : assert property (AXI4_RUSER_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RUSEr_STABLE"); + +/********************************************** FAILED ******************************************************/ + /* ruser_x : assert property (AXI4_RUSEr_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_RUSEr_X");*/ + +/********************************************** Cover Property ******************************************************/ + + cov_rvalid_reset : cover property(AXI4_RVALID_RESET); + + cov_rvalid_stable : cover property(AXI4_RVALID_STABLE); + + cov_rid_stable : cover property(AXI4_RID_STABLE); + + cov_rdata_stable : cover property(AXI4_RDATA_STABLE); + + cov_rresp_stable : cover property(AXI4_RRESP_STABLE); + + cov_ruser_stable : cover property(AXI4_RUSER_STABLE); + + cov_rlast_stable : cover property(AXI4_RLAST_STABLE); + +endmodule : uvma_axi_r_assert diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_w_assert.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_w_assert.sv new file mode 100644 index 000000000..6aa5320bf --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_w_assert.sv @@ -0,0 +1,125 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) +// Co-Author: Abdelaali Khardazi + +// *************************** WRITE DATA CHANNEL ************************** // + +module uvma_axi_w_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + +// *************************** Check if Write Signals are not equal to X or Z when WVALID is HIGH (Section A3.2.2)************************** // + + property AXI4_WDATA_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!$isunknown(axi_assert.psv_axi_cb.w_data)); + endproperty + + property AXI4_WSTRB_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!$isunknown(axi_assert.psv_axi_cb.w_strb)); + endproperty + + property AXI4_WLAST_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!$isunknown(axi_assert.psv_axi_cb.w_last)); + endproperty + + property AXI4_WUSER_X; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!$isunknown(axi_assert.psv_axi_cb.w_user)); + endproperty + + // A value of X on WVALID is not permitted when not in reset (Section A3.1.2) + property AXI4_WVALID_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.w_valid)); + endproperty + + // A value of X on WREADY is not permitted when not in reset (Section A3.1.2) + property AXI4_WREADY_X; + @(posedge clk) disable iff (!rst_n) (!$isunknown(axi_assert.psv_axi_cb.w_ready)); + endproperty + +// *************************** Check if Write Signals are stable when AWVALID is HIGH (Section A3.2.1) ************************** // + + property AXI4_WDATA_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!axi_assert.psv_axi_cb.w_ready |=> ($stable(axi_assert.psv_axi_cb.w_data))); + endproperty + + property AXI4_WSTRB_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!axi_assert.psv_axi_cb.w_ready |=> ($stable(axi_assert.psv_axi_cb.w_strb))); + endproperty + + property AXI4_WLAST_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!axi_assert.psv_axi_cb.w_ready |=> ($stable(axi_assert.psv_axi_cb.w_last))); + endproperty + + property AXI4_WUSER_STABLE; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> (!axi_assert.psv_axi_cb.w_ready |=> ($stable(axi_assert.psv_axi_cb.w_user))); + endproperty + + // Check if, Once asserted, w_valid must remain asserted until w_ready is HIGH (Section A3.2.1) + property AXI4_WVALID_STABLE ; + @(posedge clk) disable iff (!rst_n) axi_assert.psv_axi_cb.w_valid |-> ( axi_assert.psv_axi_cb.w_valid throughout (axi_assert.psv_axi_cb.w_ready [->1])); + endproperty + + //Check if WVALID is LOW for the first cycle after ARESETn goes HIGH (Figure A3-1) + property AXI4_WVALID_RESET; + @(posedge clk) $rose(rst_n) |=> !(axi_assert.psv_axi_cb.w_valid); + endproperty + +/********************************************** Assert Property ******************************************************/ + + wvalid_reset : assert property (AXI4_WVALID_RESET) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WVALID_RESET"); + + wdata_x : assert property (AXI4_WDATA_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WDATA_X"); + + wstrb_x : assert property (AXI4_WSTRB_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WSTRB_X"); + + wlast_x : assert property (AXI4_WLAST_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WLAST_X"); + + wuser_x : assert property (AXI4_WUSER_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WUSER_X"); + + wvalid_x : assert property (AXI4_WVALID_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WVALID_X"); + + wready_x : assert property (AXI4_WREADY_X) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WREADY_X"); + + wvalid_stable : assert property (AXI4_WVALID_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WVALID_STABLE"); + + wdata_stable : assert property (AXI4_WDATA_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WDATA_STABLE"); + + wstrb_stable : assert property (AXI4_WSTRB_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WSTRB_STABLE"); + + wlast_stable : assert property (AXI4_WLAST_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WLAST_STABLE"); + + wuser_stable : assert property (AXI4_WUSER_STABLE) + else `uvm_error (" AXI4 protocol ckecks assertion ", "Violation of AXI4_WUSER_STABLE"); + +/********************************************** Cover Property ******************************************************/ + + cov_wvalid_reset : cover property(AXI4_WVALID_RESET); + + cov_wvalid_stable : cover property(AXI4_WVALID_STABLE); + + cov_wdata_stable : cover property(AXI4_WDATA_STABLE); + + cov_wstrb_stable : cover property(AXI4_WSTRB_STABLE); + + cov_wuser_stable : cover property(AXI4_WUSER_STABLE); + + cov_wlast_stable : cover property(AXI4_WLAST_STABLE); + +endmodule : uvma_axi_w_assert From aac24f0652782479c0982043de7f42f79854e721 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 1 Feb 2023 10:41:00 +0100 Subject: [PATCH 042/183] axi_agent: Bind assertions to the AXI interface in testbench Signed-off-by: Alae Eddine Ez zejjari --- cva6/tb/uvmt/uvmt_axi_assert.sv | 46 +++++++++++++++++++++++++++++++++ cva6/tb/uvmt/uvmt_cva6.flist | 2 ++ cva6/tb/uvmt/uvmt_cva6_tb.sv | 6 +++++ 3 files changed, 54 insertions(+) create mode 100644 cva6/tb/uvmt/uvmt_axi_assert.sv diff --git a/cva6/tb/uvmt/uvmt_axi_assert.sv b/cva6/tb/uvmt/uvmt_axi_assert.sv new file mode 100644 index 000000000..d61c27a78 --- /dev/null +++ b/cva6/tb/uvmt/uvmt_axi_assert.sv @@ -0,0 +1,46 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +module uvmt_axi_assert (uvma_axi_intf.passive axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + + + bind uvmt_axi_assert + uvma_axi_aw_assert axi_aw_assert(.axi_assert(axi_assert), + .clk(clk), + .rst_n(rst_n) + ); + + bind uvmt_axi_assert + uvma_axi_ar_assert axi_ar_assert(.axi_assert(axi_assert), + .clk(clk), + .rst_n(rst_n) + ); + + bind uvmt_axi_assert + uvma_axi_w_assert axi_w_assert(.axi_assert(axi_assert), + .clk(clk), + .rst_n(rst_n) + ); + + bind uvmt_axi_assert + uvma_axi_r_assert axi_r_assert(.axi_assert(axi_assert), + .clk(clk), + .rst_n(rst_n) + ); + + bind uvmt_axi_assert + uvma_axi_b_assert axi_b_assert(.axi_assert(axi_assert), + .clk(clk), + .rst_n(rst_n) + ); + + +endmodule : uvmt_axi_assert diff --git a/cva6/tb/uvmt/uvmt_cva6.flist b/cva6/tb/uvmt/uvmt_cva6.flist index 0c04c48ad..f81101869 100644 --- a/cva6/tb/uvmt/uvmt_cva6.flist +++ b/cva6/tb/uvmt/uvmt_cva6.flist @@ -45,3 +45,5 @@ ${CVA6_UVMT_DIR}/uvmt_cva6_tb_ifs.sv ${CVA6_UVMT_DIR}/uvmt_cva6_tb.sv ${CVA6_UVMT_DIR}/uvmt_cva6_dut_wrap.sv ${CVA6_UVMT_DIR}/cva6_tb_wrapper.sv + +${CVA6_UVMT_DIR}/uvmt_axi_assert.sv diff --git a/cva6/tb/uvmt/uvmt_cva6_tb.sv b/cva6/tb/uvmt/uvmt_cva6_tb.sv index 8fedee7c1..393c2bf9c 100644 --- a/cva6/tb/uvmt/uvmt_cva6_tb.sv +++ b/cva6/tb/uvmt/uvmt_cva6_tb.sv @@ -58,6 +58,12 @@ module uvmt_cva6_tb; .clk(clknrst_if.clk), .reset_n(clknrst_if.reset_n) ); + //bind assertion module for axi interface + bind uvmt_cva6_dut_wrap + uvmt_axi_assert axi_assert(.axi_assert(axi_if.passive), + .clk(clknrst_if.clk), + .rst_n(clknrst_if.reset_n) + ); // DUT Wrapper Interfaces uvmt_rvfi_if rvfi_if( .rvfi_o() From 94fba13d3b31664ba531c8033ece86f728b17a92 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 1 Feb 2023 10:43:03 +0100 Subject: [PATCH 043/183] axi_agent: add assertions for CVA6 Signed-off-by: Alae Eddine Ez zejjari --- cva6/tb/uvmt/uvmt_axi_assert.sv | 6 + cva6/tb/uvmt/uvmt_cva6.flist | 1 + cva6/tb/uvmt/uvmt_cva6_axi_assert.sv | 187 +++++++++++++++++++++++++++ 3 files changed, 194 insertions(+) create mode 100644 cva6/tb/uvmt/uvmt_cva6_axi_assert.sv diff --git a/cva6/tb/uvmt/uvmt_axi_assert.sv b/cva6/tb/uvmt/uvmt_axi_assert.sv index d61c27a78..843153cdf 100644 --- a/cva6/tb/uvmt/uvmt_axi_assert.sv +++ b/cva6/tb/uvmt/uvmt_axi_assert.sv @@ -42,5 +42,11 @@ module uvmt_axi_assert (uvma_axi_intf.passive axi_assert, input bit clk, input .rst_n(rst_n) ); + bind uvmt_axi_assert + uvmt_cva6_axi_assert cva6_axi_assert(.axi_assert(axi_assert), + .clk(clk), + .rst_n(rst_n) + ); + endmodule : uvmt_axi_assert diff --git a/cva6/tb/uvmt/uvmt_cva6.flist b/cva6/tb/uvmt/uvmt_cva6.flist index f81101869..a805b6b3a 100644 --- a/cva6/tb/uvmt/uvmt_cva6.flist +++ b/cva6/tb/uvmt/uvmt_cva6.flist @@ -47,3 +47,4 @@ ${CVA6_UVMT_DIR}/uvmt_cva6_dut_wrap.sv ${CVA6_UVMT_DIR}/cva6_tb_wrapper.sv ${CVA6_UVMT_DIR}/uvmt_axi_assert.sv +${CVA6_UVMT_DIR}/uvmt_cva6_axi_assert.sv diff --git a/cva6/tb/uvmt/uvmt_cva6_axi_assert.sv b/cva6/tb/uvmt/uvmt_cva6_axi_assert.sv new file mode 100644 index 000000000..749d79d38 --- /dev/null +++ b/cva6/tb/uvmt/uvmt_cva6_axi_assert.sv @@ -0,0 +1,187 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + +// *************************** AXI features supported by CVA6 ************************** // + +module uvmt_cva6_axi_assert (uvma_axi_intf axi_assert, input bit clk, input rst_n); + + import uvm_pkg::*; + + + //check if the CVA6 identify read transaction with an ID equal to 0 or 1 + property AXI4_CVA6_ARID; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_id == 0 || axi_assert.ar_id == 1; + endproperty + + //check if the CVA6 identify write transaction with an ID equal to 0 or 1 + property AXI4_CVA6_AWID; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_id == 1; + endproperty + + //Check if user-defined extension for read address channel is equal to 0b00 + property AXI4_CVA6_ARUSER; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_user == 0; + endproperty + + //Check if user-defined extension for write address channel is equal to 0b00 + property AXI4_CVA6_AWUSER; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_user == 0; + endproperty + + //Check if Quality of Service identifier for write transaction is equal to 0b0000 + property AXI4_CVA6_AWQOS; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_qos == 0; + endproperty + + //Check if Quality of Service identifier for read transaction is equal to 0b0000 + property AXI4_CVA6_ARQOS; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_qos == 0; + endproperty + + //Check if Region indicator for write transaction is equal to 0b0000 + property AXI4_CVA6_AWREGION; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_region == 0; + endproperty + + //Check if Region indicator for read transaction is equal to 0b0000 + property AXI4_CVA6_ARREGION; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_region == 0; + endproperty + + //Check if AWCACHE is always equal to 0b0000 + property AXI4_CVA6_AWCACHE; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_cache == 0; + endproperty + + //Check if ARCACHE is always equal to 0b0000 + property AXI4_CVA6_ARCACHE; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_cache == 0; + endproperty + + //Check if Protection attributes for write transaction always take the 0b000 + property AXI4_CVA6_AWPROT; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_prot == 0; + endproperty + + //Check if Protection attributes for read transaction always take the 0b000 + property AXI4_CVA6_ARPROT; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_prot == 0; + endproperty + + //Check if all write transaction performed by CVA6 are of type INCR + property AXI4_CVA6_AWBURST; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_burst == 1; + endproperty + + //Check if all read transaction performed by CVA6 are of type INCR + property AXI4_CVA6_ARBURST; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_burst == 1; + endproperty + + //Check if all write transaction performed by CVA6 are equal to 0 or 1 + property AXI4_CVA6_AWLEN; + @(posedge clk) disable iff (!rst_n) axi_assert.aw_valid |-> axi_assert.aw_len == 0; + endproperty + + //Check if all Read transaction performed by CVA6 are equal to 0 or 1 + property AXI4_CVA6_ARLEN; + @(posedge clk) disable iff (!rst_n) axi_assert.ar_valid |-> axi_assert.ar_len == 1; + endproperty + +/********************************************** Assert Property ******************************************************/ + + cva6_arid : assert property (AXI4_CVA6_ARID) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARID"); + + cva6_awid : assert property (AXI4_CVA6_AWID) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWID"); + + cva6_aruser : assert property (AXI4_CVA6_ARUSER) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARUSER"); + + cva6_awuser : assert property (AXI4_CVA6_AWUSER) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWUSER"); + + cva6_arqos : assert property (AXI4_CVA6_ARQOS) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARQOS"); + + cva6_awqos : assert property (AXI4_CVA6_AWQOS) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWQOS"); + + cva6_arregion : assert property (AXI4_CVA6_ARREGION) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARREGION"); + + cva6_awregion : assert property (AXI4_CVA6_AWREGION) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWREGION"); + + cva6_arcache : assert property (AXI4_CVA6_ARCACHE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARCAHCE"); + + cva6_awcache : assert property (AXI4_CVA6_AWCACHE) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWCAHCE"); + + cva6_arprot : assert property (AXI4_CVA6_ARPROT) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARPROT"); + + cva6_awprot : assert property (AXI4_CVA6_AWPROT) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWPROT"); + + cva6_arburst : assert property (AXI4_CVA6_ARBURST) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARBURST"); + + cva6_awburst : assert property (AXI4_CVA6_AWBURST) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWBURST"); + + cva6_arlen : assert property (AXI4_CVA6_ARLEN) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_ARLEN"); + + cva6_awlen : assert property (AXI4_CVA6_AWLEN) + else `uvm_error (" AXI4 protocol checks assertion ", "Violation of AXI4_CVA6_AWLEN"); + +/********************************************** Cover Property ******************************************************/ + + + cov_cva6_arid : cover property(AXI4_CVA6_ARID); + + cov_cva6_awid : cover property(AXI4_CVA6_AWID); + + cov_cva6_aruser : cover property(AXI4_CVA6_ARUSER); + + cov_cva6_awuser : cover property(AXI4_CVA6_AWUSER); + + cov_cva6_arqos : cover property(AXI4_CVA6_ARQOS); + + cov_cva6_awqos : cover property(AXI4_CVA6_AWQOS); + + cov_cva6_arregion : cover property(AXI4_CVA6_ARREGION); + + cov_cva6_awregion : cover property(AXI4_CVA6_AWREGION); + + cov_cva6_arcache : cover property(AXI4_CVA6_ARCACHE); + + cov_cva6_awcache : cover property(AXI4_CVA6_AWCACHE); + + cov_cva6_arprot : cover property(AXI4_CVA6_ARPROT); + + cov_cva6_awprot : cover property(AXI4_CVA6_AWPROT); + + cov_cva6_arburst : cover property(AXI4_CVA6_ARBURST); + + cov_cva6_awburst : cover property(AXI4_CVA6_AWBURST); + + cov_cva6_arlen : cover property(AXI4_CVA6_ARLEN); + + cov_cva6_awlen : cover property(AXI4_CVA6_AWLEN); + + + + +endmodule : uvmt_cva6_axi_assert + + From 89897bd8a95436088deed9f8e56a46cdaac9627d Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Thu, 8 Dec 2022 16:32:10 +0100 Subject: [PATCH 044/183] axi_agent: Add transaction logger module Signed-off-by: Alae Eddine Ez zejjari --- .../uvma_axi/src/comps/uvma_axi_agent.sv | 16 ++ .../uvma_axi_ar_agent/uvma_axi_ar_mon.sv | 14 + .../uvma_axi_aw_agent/uvma_axi_aw_mon.sv | 14 + .../comps/uvma_axi_b_agent/uvma_axi_b_mon.sv | 13 + .../comps/uvma_axi_r_agent/uvma_axi_r_mon.sv | 15 ++ .../src/comps/uvma_axi_seq_item_logger.sv | 246 ++++++++++++++++++ .../comps/uvma_axi_w_agent/uvma_axi_w_mon.sv | 14 + .../uvma_axi/src/obj/uvma_axi_cfg.sv | 1 + .../src/seq/uvma_axi_base_seq_item.sv | 94 +++++++ lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv | 6 + 10 files changed, 433 insertions(+) create mode 100644 lib/uvm_agents/uvma_axi/src/comps/uvma_axi_seq_item_logger.sv create mode 100644 lib/uvm_agents/uvma_axi/src/seq/uvma_axi_base_seq_item.sv diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv index b3652b533..cc3630b27 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_agent.sv @@ -24,6 +24,8 @@ class uvma_axi_agent_c extends uvm_agent; uvma_axi_r_agent_c r_agent; uvma_axi_vsqr_c vsequencer; + uvma_axi_seq_item_logger_c seq_item_logger; + uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; @@ -83,6 +85,7 @@ class uvma_axi_agent_c extends uvm_agent; this.b_agent = uvma_axi_b_agent_c :: type_id :: create("b_agent", this); this.ar_agent = uvma_axi_ar_agent_c :: type_id :: create("ar_agent", this); this.r_agent = uvma_axi_r_agent_c :: type_id :: create("r_agent", this); + this.seq_item_logger = uvma_axi_seq_item_logger_c::type_id::create("seq_item_logger", this); if( cfg.is_active == UVM_ACTIVE) begin vsequencer = uvma_axi_vsqr_c::type_id::create("sequencer", this); end @@ -99,6 +102,10 @@ class uvma_axi_agent_c extends uvm_agent; `uvm_info(get_type_name(), $sformatf("PASSIVE MODE"), UVM_LOW) end + if (cfg.trn_log_enabled) begin + connect_trn_loggers(); + end + endfunction function void connect_mon_2_sqr(); @@ -133,6 +140,15 @@ class uvma_axi_agent_c extends uvm_agent; endfunction: assemble_vsequencer + function void connect_trn_loggers(); + + this.aw_agent.monitor.aw_mon2log_port.connect(seq_item_logger.analysis_export); + this.w_agent.monitor.w_mon2log_port.connect(seq_item_logger.analysis_export); + this.b_agent.monitor.b_mon2log_port.connect(seq_item_logger.analysis_export); + this.ar_agent.monitor.ar_mon2log_port.connect(seq_item_logger.analysis_export); + this.r_agent.monitor.r_mon2log_port.connect(seq_item_logger.analysis_export); + + endfunction : connect_trn_loggers endclass : uvma_axi_agent_c diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv index f9d81b746..482b44884 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_ar_agent/uvma_axi_ar_mon.sv @@ -18,8 +18,10 @@ class uvma_axi_ar_mon_c extends uvm_monitor; uvma_axi_ar_item_c ar_item; uvma_axi_ar_item_c ardrv_item; + uvma_axi_base_seq_item_c transaction; uvm_analysis_port#(uvma_axi_ar_item_c) uvma_ar_mon_port; uvm_analysis_port#(uvma_axi_ar_item_c) uvma_ar_mon2drv_port; + uvm_analysis_port#(uvma_axi_base_seq_item_c) ar_mon2log_port; uvma_axi_cfg_c cfg; uvma_axi_cntxt_c cntxt; @@ -31,6 +33,7 @@ class uvma_axi_ar_mon_c extends uvm_monitor; super.new(name, parent); this.uvma_ar_mon_port = new("uvma_ar_mon_port", this); this.uvma_ar_mon2drv_port = new("uvma_ar_mon2drv_port", this); + this.ar_mon2log_port = new("ar_mon2log_port", this); endfunction function void build_phase(uvm_phase phase); @@ -46,6 +49,7 @@ class uvma_axi_ar_mon_c extends uvm_monitor; ar_item = uvma_axi_ar_item_c::type_id::create("ar_item", this); ardrv_item = uvma_axi_ar_item_c::type_id::create("ardrv_item", this); + transaction = uvma_axi_base_seq_item_c::type_id::create("transaction", this); void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); if (cfg == null) begin @@ -104,6 +108,16 @@ class uvma_axi_ar_mon_c extends uvm_monitor; this.uvma_ar_mon2drv_port.write(this.ardrv_item); end this.uvma_ar_mon_port.write(this.ar_item); + + this.transaction.ar_id = passive_mp.psv_axi_cb.ar_id; + this.transaction.ar_addr = passive_mp.psv_axi_cb.ar_addr; + this.transaction.ar_valid = passive_mp.psv_axi_cb.ar_valid; + this.transaction.ar_ready = passive_mp.psv_axi_cb.ar_ready; + this.transaction.ar_lock = passive_mp.psv_axi_cb.ar_lock; + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + this.ar_mon2log_port.write(transaction); + end + @(passive_mp.psv_axi_cb); end endtask: monitor_ar_items diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv index e861b4b34..e9c2ada2e 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_aw_agent/uvma_axi_aw_mon.sv @@ -21,9 +21,11 @@ class uvma_axi_aw_mon_c extends uvm_monitor; uvma_axi_aw_item_c aw_item; uvma_axi_aw_item_c awdrv_item; + uvma_axi_base_seq_item_c transaction; uvm_analysis_port #(uvma_axi_aw_item_c) uvma_aw_mon_port; uvm_analysis_port #(uvma_axi_aw_item_c) uvma_aw_mon2drv_port; + uvm_analysis_port#(uvma_axi_base_seq_item_c) aw_mon2log_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; @@ -33,6 +35,7 @@ class uvma_axi_aw_mon_c extends uvm_monitor; super.new(name, parent); this.uvma_aw_mon_port = new("uvma_aw_mon_port", this); this.uvma_aw_mon2drv_port = new("uvma_aw_mon2drv_port", this); + this.aw_mon2log_port = new("aw_mon2log_port", this); endfunction function void build_phase(uvm_phase phase); @@ -49,6 +52,7 @@ class uvma_axi_aw_mon_c extends uvm_monitor; this.aw_item = uvma_axi_aw_item_c::type_id::create("aw_item", this); this.awdrv_item = uvma_axi_aw_item_c::type_id::create("awdrv_item", this); + this.transaction = uvma_axi_base_seq_item_c::type_id::create("transaction", this); void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); if (cfg == null) begin @@ -118,6 +122,16 @@ class uvma_axi_aw_mon_c extends uvm_monitor; end this.uvma_aw_mon_port.write(this.aw_item); + + this.transaction.aw_id = passive_mp.psv_axi_cb.aw_id; + this.transaction.aw_addr = passive_mp.psv_axi_cb.aw_addr; + this.transaction.aw_valid = passive_mp.psv_axi_cb.aw_valid; + this.transaction.aw_ready = passive_mp.psv_axi_cb.aw_ready; + this.transaction.aw_lock = passive_mp.psv_axi_cb.aw_lock; + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + this.aw_mon2log_port.write(this.transaction); + end + @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv index 97b0212e6..39159b94b 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_b_agent/uvma_axi_b_mon.sv @@ -22,9 +22,11 @@ class uvma_axi_b_mon_c extends uvm_monitor; uvma_axi_b_item_c b_item; uvma_axi_b_item_c bdrv_item; + uvma_axi_base_seq_item_c transaction; uvm_analysis_port #(uvma_axi_b_item_c) uvma_b_mon_port; uvm_analysis_port #(uvma_axi_b_item_c) uvma_b_mon2drv_port; + uvm_analysis_port#(uvma_axi_base_seq_item_c) b_mon2log_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; @@ -40,6 +42,7 @@ function uvma_axi_b_mon_c::new(string name = "uvma_axi_b_mon_c", uvm_component p super.new(name, parent); this.uvma_b_mon_port = new("uvma_b_mon_port", this); this.uvma_b_mon2drv_port = new("uvma_b_mon2drv_port", this); + this.b_mon2log_port = new("b_mon2log_port", this); endfunction function void uvma_axi_b_mon_c::build_phase(uvm_phase phase); @@ -61,6 +64,7 @@ function void uvma_axi_b_mon_c::build_phase(uvm_phase phase); this.b_item = uvma_axi_b_item_c::type_id::create("b_item", this); this.bdrv_item = uvma_axi_b_item_c::type_id::create("bdrv_item", this); + this.transaction = uvma_axi_base_seq_item_c::type_id::create("transaction", this); endfunction:build_phase @@ -91,6 +95,15 @@ task uvma_axi_b_mon_c::monitor_b_items(); this.bdrv_item.b_ready = vif.b_ready; this.uvma_b_mon2drv_port.write(this.bdrv_item); end + + this.transaction.b_id = passive_mp.psv_axi_cb.b_id; + this.transaction.b_resp = passive_mp.psv_axi_cb.b_resp; + this.transaction.b_valid = passive_mp.psv_axi_cb.b_valid; + this.transaction.b_ready = passive_mp.psv_axi_cb.b_ready; + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + this.b_mon2log_port.write(transaction); + end + @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv index 14a4ae81e..34a14a3a9 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_r_agent/uvma_axi_r_mon.sv @@ -22,9 +22,11 @@ class uvma_axi_r_mon_c extends uvm_monitor; uvma_axi_r_item_c r_item; uvma_axi_r_item_c rdrv_item; + uvma_axi_base_seq_item_c transaction; uvm_analysis_port #(uvma_axi_r_item_c) uvma_r_mon_port; uvm_analysis_port #(uvma_axi_r_item_c) uvma_r_mon2drv_port; + uvm_analysis_port#(uvma_axi_base_seq_item_c) r_mon2log_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; @@ -43,6 +45,7 @@ function uvma_axi_r_mon_c::new(string name = "uvma_axi_r_mon_c", uvm_component p super.new(name, parent); uvma_r_mon_port = new("uvma_r_mon_port", this); uvma_r_mon2drv_port = new("uvma_r_mon2drv_port", this); + r_mon2log_port = new("r_mon2log_port", this); endfunction @@ -64,6 +67,7 @@ function void uvma_axi_r_mon_c::build_phase(uvm_phase phase); this.r_item = uvma_axi_r_item_c::type_id::create("r_item", this); this.rdrv_item = uvma_axi_r_item_c::type_id::create("rdrv_item", this); + this.transaction = uvma_axi_base_seq_item_c::type_id::create("transaction", this); endfunction @@ -103,6 +107,17 @@ task uvma_axi_r_mon_c::monitor_r_items(); this.rdrv_item.r_ready = vif.r_ready; this.uvma_r_mon2drv_port.write(this.rdrv_item); end + + this.transaction.r_id = passive_mp.psv_axi_cb.r_id; + this.transaction.r_data = passive_mp.psv_axi_cb.r_data; + this.transaction.r_valid = passive_mp.psv_axi_cb.r_valid; + this.transaction.r_ready = passive_mp.psv_axi_cb.r_ready; + this.transaction.r_resp = passive_mp.psv_axi_cb.r_resp; + this.transaction.r_last = passive_mp.psv_axi_cb.r_last; + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + this.r_mon2log_port.write(transaction); + end + @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_seq_item_logger.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_seq_item_logger.sv new file mode 100644 index 000000000..4748c276e --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_seq_item_logger.sv @@ -0,0 +1,246 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + + +`ifndef __UVMA_AXI_SEQ_ITEM_LOGGER_SV__ +`define __UVMA_AXI_SEQ_ITEM_LOGGER_SV__ + + +/** + * Component writing Open Bus Interface sequence items debug data to disk as plain text. + */ +class uvma_axi_seq_item_logger_c extends uvml_logs_seq_item_logger_c #( + .T_TRN (uvma_axi_base_seq_item_c), + .T_CFG (uvma_axi_cfg_c ), + .T_CNTXT(uvma_axi_cntxt_c ) +); + + `uvm_component_utils(uvma_axi_seq_item_logger_c) + + + /** + * Default constructor. + */ + function new(string name="uvma_axi_seq_item_logger", uvm_component parent=null); + super.new(name, parent); + endfunction : new + + /** + * Writes contents of t to disk. + */ + virtual function void write(uvma_axi_base_seq_item_c trs); + if(cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET)begin + + string write_address_access = ""; + string aw_access_type = ""; + string aw_address = ""; + string aw_id_str = ""; + + string write_data_access = ""; + string w_data = ""; + string w_access_complet = ""; + + string write_response_access = ""; + string b_err = ""; + string b_id_str = ""; + + string read_address_access = ""; + string ar_access_type = ""; + string ar_address = ""; + string ar_id_str = ""; + + string read_data_access = ""; + string r_err = ""; + string r_data = ""; + string r_id_str = ""; + string r_access_complet = ""; + + if(trs.aw_valid && trs.aw_ready) begin + + write_address_access = "write_address_access"; + if(trs.aw_lock) begin + aw_access_type = "Exclusive_access"; + end else begin + aw_access_type = "Normal_access"; + end + aw_address = $sformatf("%h", trs.aw_addr); + aw_id_str = $sformatf("%b", trs.aw_id); + fwrite($sformatf("----> %t | %s | %s | %s | %s", $realtime(), write_address_access, aw_address, aw_access_type, aw_id_str)); + + end else begin + + write_address_access = ""; + aw_access_type = ""; + aw_address = ""; + aw_id_str = ""; + + end + + if(trs.w_valid && trs.w_ready) begin + + write_data_access = "write_data_access"; + w_data = $sformatf("%h", trs.w_data); + if(trs.w_last) begin + w_access_complet = "Yes"; + end else begin + w_access_complet = "No"; + end + fwrite($sformatf("----> %t | %s | %s | %s", $realtime(), write_data_access, w_data, w_access_complet)); + + end else begin + + write_data_access = ""; + w_data = ""; + w_access_complet = ""; + + end + + if(trs.b_valid && trs.b_ready) begin + + write_response_access = "write_response_access"; + case (trs.b_resp) + 00 : b_err = "No Err"; + 01 : b_err = "Err"; + 10 : b_err = "Err"; + 11 : b_err = "Err"; + default : b_err = " ? "; + endcase + b_id_str = $sformatf("%b", trs.b_id); + fwrite($sformatf("----> %t | %s | __ | %s | __ | %s", $realtime(), write_response_access, b_id_str, b_err)); + + end else begin + + write_response_access = ""; + b_err = ""; + b_id_str = ""; + + end + + if(trs.ar_valid && trs.ar_ready) begin + + read_address_access = "read_address_access"; + if(trs.ar_lock) begin + ar_access_type = "Exclusive_access"; + end else begin + ar_access_type = "Normal_access"; + end + ar_address = $sformatf("%h", trs.ar_addr); + ar_id_str = $sformatf("%b", trs.ar_id); + fwrite($sformatf("----> %t | %s | %s | %s | %s", $realtime(), read_address_access, ar_address, ar_access_type, ar_id_str)); + + end else begin + + read_address_access = ""; + ar_address = ""; + ar_access_type = ""; + ar_id_str = ""; + + end + + if(trs.r_valid && trs.r_ready) begin + + read_data_access = "read_data_access"; + r_data = $sformatf("%h", trs.r_data); + r_id_str = $sformatf("%b", trs.r_id); + if(trs.r_last) begin + r_access_complet = "Yes"; + end else begin + r_access_complet = "No"; + end + case (trs.r_resp) + 00 : r_err = "No Err"; + 01 : r_err = "Err"; + 10 : r_err = "Err"; + 11 : r_err = "Err"; + default : r_err = " ? "; + endcase + fwrite($sformatf("----> %t | %s | %s | %s | %s | %s", $realtime(), read_data_access, r_data, r_access_complet, r_id_str, r_err)); + + end else begin + + read_data_access = ""; + r_data = ""; + r_access_complet = ""; + r_err = ""; + r_id_str = ""; + + end + end + endfunction : write + +// A significant chunk of the write_mstr method is common between this +// sequence item logger and the monitor transaction logger. Given that +// much of this code is template generated, and is not expected to be edited +// further, the duplicated code has a lint waiver. +// +//@DVT_LINTER_WAIVER_START "MT20210901_2" disable SVTB.33.1.0, SVTB.33.2.0 + /** + * Writes contents of mstr t to disk. + */ + + /** + * Writes log header to disk. + */ + virtual function void print_header(); + + fwrite("-------------------------------------------------------------------------------------------"); + fwrite(" TIME | AW/W/B/AR/R | ADDRESS : AW/AR | ACCESS TYPE : AW/AR | ID | ERR : B/R "); + fwrite(" TIME | ACCESS | DATA : W/R | LAST DATA : W/R | | "); + fwrite("-------------------------------------------------------------------------------------------"); + + endfunction : print_header + +endclass : uvma_axi_seq_item_logger_c + +/** + * Component writing Open Bus Interface monitor transactions debug data to disk as JavaScript Object Notation (JSON). + */ +class uvma_axi_seq_item_logger_json_c extends uvma_axi_seq_item_logger_c; + + `uvm_component_utils(uvma_axi_seq_item_logger_json_c) + + /** + * Set file extension to '.json'. + */ + function new(string name="uvma_axi_seq_item_logger_json", uvm_component parent=null); + + super.new(name, parent); + fextension = "json"; + + endfunction : new + + /** + * Writes contents of t to disk. + */ + virtual function void write(uvma_axi_base_seq_item_c t); + + // TODO Implement uvma_obi_memory_seq_item_logger_json_c::write() + // Ex: fwrite({"{", + // $sformatf("\"time\":\"%0t\",", $realtime()), + // $sformatf("\"a\":%h," , t.a ), + // $sformatf("\"b\":%b," , t.b ), + // $sformatf("\"c\":%d," , t.c ), + // $sformatf("\"d\":%h," , t.c ), + // "},"}); + + endfunction : write + + /** + * Empty function. + */ + virtual function void print_header(); + + // Do nothing: JSON files do not use headers. + + endfunction : print_header + +endclass : uvma_axi_seq_item_logger_json_c + + +`endif // __UVMA_AXI_SEQ_ITEM_LOGGER_SV__ diff --git a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv index 4ee256077..055add481 100644 --- a/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv +++ b/lib/uvm_agents/uvma_axi/src/comps/uvma_axi_w_agent/uvma_axi_w_mon.sv @@ -22,9 +22,11 @@ class uvma_axi_w_mon_c extends uvm_monitor; uvma_axi_w_item_c w_item; uvma_axi_w_item_c wdrv_item; + uvma_axi_base_seq_item_c transaction; uvm_analysis_port #(uvma_axi_w_item_c) uvma_w_mon_port; uvm_analysis_port #(uvma_axi_w_item_c) uvma_w_mon2drv_port; + uvm_analysis_port#(uvma_axi_base_seq_item_c) w_mon2log_port; // Handles to virtual interface modport virtual uvma_axi_intf.passive passive_mp; @@ -42,6 +44,7 @@ function uvma_axi_w_mon_c::new(string name = "uvma_axi_w_mon_c", uvm_component p super.new(name, parent); uvma_w_mon_port = new("uvma_w_mon_port", this); uvma_w_mon2drv_port = new("uvma_w_mon2drv_port", this); + w_mon2log_port = new("w_mon2log_port", this); endfunction @@ -59,6 +62,7 @@ function void uvma_axi_w_mon_c::build_phase(uvm_phase phase); w_item = uvma_axi_w_item_c::type_id::create("w_item", this); wdrv_item = uvma_axi_w_item_c::type_id::create("wdrv_item", this); + transaction = uvma_axi_base_seq_item_c::type_id::create("transaction", this); void'(uvm_config_db#(uvma_axi_cfg_c)::get(this, "", "cfg", cfg)); if (cfg == null) begin @@ -82,6 +86,7 @@ task uvma_axi_w_mon_c::monitor_w_items(); w_item.w_user = passive_mp.psv_axi_cb.w_user; w_item.w_valid = passive_mp.psv_axi_cb.w_valid; w_item.w_ready = passive_mp.psv_axi_cb.w_ready; + if(cfg.is_active) begin // collect AR signals this.wdrv_item.w_strb = vif.w_strb; @@ -93,6 +98,15 @@ task uvma_axi_w_mon_c::monitor_w_items(); this.uvma_w_mon2drv_port.write(this.wdrv_item); end this.uvma_w_mon_port.write(this.w_item); + + this.transaction.w_valid = passive_mp.psv_axi_cb.w_valid; + this.transaction.w_ready = passive_mp.psv_axi_cb.w_ready; + this.transaction.w_data = passive_mp.psv_axi_cb.w_data; + this.transaction.w_last = passive_mp.psv_axi_cb.w_last; + if( cntxt.reset_state == UVMA_AXI_RESET_STATE_POST_RESET) begin + w_mon2log_port.write(transaction); + end + @(passive_mp.psv_axi_cb); end diff --git a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv index 033a56682..ac2c7d253 100644 --- a/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv +++ b/lib/uvm_agents/uvma_axi/src/obj/uvma_axi_cfg.sv @@ -15,6 +15,7 @@ class uvma_axi_cfg_c extends uvm_object; rand uvm_active_passive_enum is_active; + rand bit trn_log_enabled; rand uvma_axi_drv_slv_mode_enum drv_slv_mode; rand uvma_axi_drv_slv_err_mode_enum drv_slv_err_mode; diff --git a/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_base_seq_item.sv b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_base_seq_item.sv new file mode 100644 index 000000000..33941fb7a --- /dev/null +++ b/lib/uvm_agents/uvma_axi/src/seq/uvma_axi_base_seq_item.sv @@ -0,0 +1,94 @@ +// Copyright 2022 Thales DIS SAS +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 +// You may obtain a copy of the License at https://solderpad.org/licenses/ +// +// Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com) + + +`ifndef __UVMA_AXI_BASE_SEQ_ITEM_SV__ +`define __UVMA_AXI_BASE_SEQ_ITEM_SV__ + + +/** + * Object created by Open Bus Interface agent sequences extending uvma_obi_memory_seq_base_c. + */ +class uvma_axi_base_seq_item_c extends uvml_trn_seq_item_c; + + rand logic ar_valid; + rand logic ar_ready; + rand logic ar_lock; + rand logic [AXI_ID_WIDTH-1:0] ar_id; + rand logic [AXI_ADDR_WIDTH-1:0] ar_addr; + rand logic [AXI_ID_WIDTH-1:0] r_id; + rand logic [AXI_ADDR_WIDTH-1:0] r_data; + rand logic r_last; + rand logic r_valid; + logic r_ready; + rand logic [1:0] r_resp; + + rand logic aw_valid; + rand logic aw_ready; + rand logic aw_lock; + rand logic [AXI_ID_WIDTH-1:0] aw_id; + rand logic [AXI_ADDR_WIDTH-1:0] aw_addr; + rand logic [AXI_DATA_WIDTH-1:0] w_data; + rand logic w_last; + rand logic w_valid; + rand logic w_ready; + rand logic [AXI_ID_WIDTH-1:0] b_id; + rand logic [1:0] b_resp; + rand logic b_valid; + rand logic b_ready; + + + // Metadata + uvma_axi_cfg_c cfg; ///< Handle to agent's configuration object + + `uvm_object_utils_begin(uvma_axi_base_seq_item_c) + `uvm_field_int(aw_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_addr, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(aw_lock, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_data, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_last, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(w_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_resp, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(b_ready, UVM_ALL_ON | UVM_NOPACK); + + `uvm_field_int(ar_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_addr, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(ar_lock, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_id, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_data, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_resp, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_last, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_valid, UVM_ALL_ON | UVM_NOPACK); + `uvm_field_int(r_ready, UVM_ALL_ON | UVM_NOPACK); + `uvm_object_utils_end + + /** + * Default constructor. + */ + extern function new(string name="uvma_axi_base_seq_item"); + +endclass : uvma_axi_base_seq_item_c + + +function uvma_axi_base_seq_item_c::new(string name="uvma_axi_base_seq_item"); + + super.new(name); + +endfunction : new + + +`endif // __UVMA_AXI_BASE_SEQ_ITEM_SV__ + diff --git a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv index 5941d1fc8..2d748b14c 100644 --- a/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv +++ b/lib/uvm_agents/uvma_axi/src/uvma_axi_pkg.sv @@ -30,6 +30,9 @@ package uvma_axi_pkg; import uvm_pkg::*; import uvml_mem_pkg ::*; + import uvml_trn_pkg ::*; + import uvml_logs_pkg ::*; + import "DPI-C" function read_elf(input string filename); import "DPI-C" function byte get_section(output longint address, output longint len); import "DPI-C" context function void read_section(input longint address, inout byte buffer[]); @@ -49,6 +52,7 @@ package uvma_axi_pkg; `include "uvma_axi_cfg.sv" `include "uvma_axi_cntxt.sv" + `include "uvma_axi_base_seq_item.sv" `include "uvma_axi_aw_item.sv" `include "uvma_axi_w_item.sv" `include "uvma_axi_b_item.sv" @@ -72,6 +76,8 @@ package uvma_axi_pkg; `include "uvma_axi_ar_sqr.sv" `include "uvma_axi_r_sqr.sv" + `include "uvma_axi_seq_item_logger.sv" + `include "uvma_axi_aw_agent.sv" `include "uvma_axi_w_agent.sv" `include "uvma_axi_b_agent.sv" From 5bf7d87205c4422b76f4ab397312a53785826358 Mon Sep 17 00:00:00 2001 From: Alae Eddine Ez zejjari Date: Wed, 1 Feb 2023 10:46:37 +0100 Subject: [PATCH 045/183] axi_agent: activation of the transaction log Signed-off-by: Alae Eddine Ez zejjari --- cva6/env/uvme/uvme_cva6_cfg.sv | 1 + 1 file changed, 1 insertion(+) diff --git a/cva6/env/uvme/uvme_cva6_cfg.sv b/cva6/env/uvme/uvme_cva6_cfg.sv index 6065c43e8..726de70ea 100644 --- a/cva6/env/uvme/uvme_cva6_cfg.sv +++ b/cva6/env/uvme/uvme_cva6_cfg.sv @@ -79,6 +79,7 @@ class uvme_cva6_cfg_c extends uvm_object; if (trn_log_enabled) { clknrst_cfg.trn_log_enabled == 1; + axi_cfg.trn_log_enabled == 1; } if (cov_model_enabled) { From bc1cd9cd9933c2af56277ad5063f136bb1209588 Mon Sep 17 00:00:00 2001 From: Ayoub Jalali Date: Tue, 21 Feb 2023 10:42:56 +0100 Subject: [PATCH 046/183] Core cntrl Agent : Add a constraint related to boot_addr value Signed-off-by: Ayoub Jalali --- lib/uvm_agents/uvma_core_cntrl/uvma_core_cntrl_cfg.sv | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/uvm_agents/uvma_core_cntrl/uvma_core_cntrl_cfg.sv b/lib/uvm_agents/uvma_core_cntrl/uvma_core_cntrl_cfg.sv index 6f660257f..afb160d1d 100644 --- a/lib/uvm_agents/uvma_core_cntrl/uvma_core_cntrl_cfg.sv +++ b/lib/uvm_agents/uvma_core_cntrl/uvma_core_cntrl_cfg.sv @@ -205,6 +205,10 @@ } } + constraint boot_addr_cons { //boot addr should be half-word aligned + boot_addr % 2 == 0; + } + /** * Creates sub-configuration objects. */ From 1a995eee8e3dacbf1510df5ae372fe684fd78516 Mon Sep 17 00:00:00 2001 From: ajalali Date: Thu, 23 Feb 2023 17:37:20 +0100 Subject: [PATCH 047/183] Re-use Core control Agent Signed-off-by: ajalali --- cva6/env/uvme/uvma_cva6_core_cntrl_agent.sv | 114 ++++++++++++++++++++ cva6/env/uvme/uvma_cva6_core_cntrl_cntxt.sv | 51 +++++++++ cva6/env/uvme/uvma_cva6_core_cntrl_drv.sv | 62 +++++++++++ cva6/env/uvme/uvme_cva6_cfg.sv | 94 +++++++++++++++- cva6/env/uvme/uvme_cva6_cntxt.sv | 3 + cva6/env/uvme/uvme_cva6_constants.sv | 2 + cva6/env/uvme/uvme_cva6_core_cntrl_if.sv | 31 ++++++ cva6/env/uvme/uvme_cva6_env.sv | 5 +- cva6/env/uvme/uvme_cva6_pkg.sv | 7 +- cva6/sim/Makefile | 1 + cva6/tb/uvmt/cva6_tb_wrapper.sv | 7 +- cva6/tb/uvmt/uvmt_cva6.flist | 1 + cva6/tb/uvmt/uvmt_cva6_constants.sv | 1 + cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv | 2 + cva6/tb/uvmt/uvmt_cva6_tb.sv | 5 + 15 files changed, 378 insertions(+), 8 deletions(-) create mode 100644 cva6/env/uvme/uvma_cva6_core_cntrl_agent.sv create mode 100644 cva6/env/uvme/uvma_cva6_core_cntrl_cntxt.sv create mode 100644 cva6/env/uvme/uvma_cva6_core_cntrl_drv.sv create mode 100644 cva6/env/uvme/uvme_cva6_core_cntrl_if.sv diff --git a/cva6/env/uvme/uvma_cva6_core_cntrl_agent.sv b/cva6/env/uvme/uvma_cva6_core_cntrl_agent.sv new file mode 100644 index 000000000..21e3c0dcf --- /dev/null +++ b/cva6/env/uvme/uvma_cva6_core_cntrl_agent.sv @@ -0,0 +1,114 @@ +// Copyright 2023 OpenHW Group +// Copyright 2023 Datum Technology Corporation +// Copyright 2023 Silicon Labs, Inc. +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://solderpad.org/licenses/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + + +`ifndef __UVMA_CVA6_CORE_CNTRL_AGENT_SV__ +`define __UVMA_CVA6_CORE_CNTRL_AGENT_SV__ + +/** + * Core control agent defined for the CVA6 + */ +class uvma_cva6_core_cntrl_agent_c extends uvma_core_cntrl_agent_c; + + + string log_tag = "CVA6CORECTRLAGT"; + + `uvm_component_utils_begin(uvma_cva6_core_cntrl_agent_c) + `uvm_component_utils_end + + /** + * Default constructor. + */ + extern function new(string name="uvma_cva6_core_cntrl_agent", uvm_component parent=null); + + /** + * Uses uvm_config_db to retrieve cntxt and hand out to sub-components. + */ + extern virtual function void get_and_set_cntxt(); + + /** + * Uses uvm_config_db to retrieve the Virtual Interface (vif) associated with this + * agent. + */ + extern virtual function void retrieve_vif(); + + /** + * Spawn active sequnces + */ + extern virtual task run_phase(uvm_phase phase); + + /** + * Spawn fetch enable control sequence + */ + extern virtual task start_fetch_toggle_seq(); + +endclass : uvma_cva6_core_cntrl_agent_c + +function uvma_cva6_core_cntrl_agent_c::new(string name="uvma_cva6_core_cntrl_agent", uvm_component parent=null); + + super.new(name, parent); + + set_inst_override_by_type("driver", uvma_core_cntrl_drv_c::get_type(), uvma_cva6_core_cntrl_drv_c::get_type()); + +endfunction : new + +function void uvma_cva6_core_cntrl_agent_c::retrieve_vif(); + + uvma_cva6_core_cntrl_cntxt_c cva6_cntxt; + + $cast(cva6_cntxt, cntxt); + + // Core control interface + if (!uvm_config_db#(virtual uvme_cva6_core_cntrl_if)::get(this, "", $sformatf("core_cntrl_vif"), cva6_cntxt.core_cntrl_vif)) begin + `uvm_fatal("VIF", $sformatf("Could not find vif handle of type %s in uvm_config_db", + $typename(cva6_cntxt.core_cntrl_vif))) + end + else begin + `uvm_info("VIF", $sformatf("Found vif handle of type %s in uvm_config_db", + $typename(cva6_cntxt.core_cntrl_vif)), UVM_DEBUG) + end +endfunction : retrieve_vif + +function void uvma_cva6_core_cntrl_agent_c::get_and_set_cntxt(); + + void'(uvm_config_db#(uvma_core_cntrl_cntxt_c)::get(this, "", "cntxt", cntxt)); + if (!cntxt) begin + `uvm_info(log_tag, "Context handle is null; creating", UVM_LOW); + cntxt = uvma_cva6_core_cntrl_cntxt_c::type_id::create("cntxt"); + end + + uvm_config_db#(uvma_core_cntrl_cntxt_c)::set(this, "*", "cntxt", cntxt); + +endfunction : get_and_set_cntxt + +task uvma_cva6_core_cntrl_agent_c::run_phase(uvm_phase phase); + + if (cfg.is_active) begin + fork + start_fetch_toggle_seq(); + join_none + end + +endtask : run_phase + +task uvma_cva6_core_cntrl_agent_c::start_fetch_toggle_seq(); + + `uvm_error(log_tag, "fetch toggle not supported in CVA6"); + +endtask : start_fetch_toggle_seq + +`endif // __UVMA_CVA6_CORE_CNTRL_AGENT_SV__ diff --git a/cva6/env/uvme/uvma_cva6_core_cntrl_cntxt.sv b/cva6/env/uvme/uvma_cva6_core_cntrl_cntxt.sv new file mode 100644 index 000000000..0973c58e3 --- /dev/null +++ b/cva6/env/uvme/uvma_cva6_core_cntrl_cntxt.sv @@ -0,0 +1,51 @@ +// Copyright 2023 OpenHW Group +// Copyright 2023 Datum Technology Corporation +// Copyright 2023 Silicon Labs, Inc. +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://solderpad.org/licenses/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +`ifndef __UVMA_CVA6_CORE_CNTRL_CNTXT_SV__ +`define __UVMA_CVA6_CORE_CNTRL_CNTXT_SV__ + + +/** + * Object encapsulating all state variables for all Rvvi agent + * (uvma_core_cntrl_agent_c) components. + */ + class uvma_cva6_core_cntrl_cntxt_c extends uvma_core_cntrl_cntxt_c; + + virtual uvme_cva6_core_cntrl_if core_cntrl_vif; + + `uvm_object_utils_begin(uvma_cva6_core_cntrl_cntxt_c) + `uvm_object_utils_end + + /** + * Builds events. + */ + extern function new(string name="uvma_cva6_core_cntrl_cntxt"); + +endclass : uvma_cva6_core_cntrl_cntxt_c + +`pragma protect begin + +function uvma_cva6_core_cntrl_cntxt_c::new(string name="uvma_cva6_core_cntrl_cntxt"); + + super.new(name); + +endfunction : new + +`pragma protect end + + +`endif // __UVMA_CVA6_CORE_CNTRL_CNTXT_SV__ diff --git a/cva6/env/uvme/uvma_cva6_core_cntrl_drv.sv b/cva6/env/uvme/uvma_cva6_core_cntrl_drv.sv new file mode 100644 index 000000000..5c6a37bd9 --- /dev/null +++ b/cva6/env/uvme/uvma_cva6_core_cntrl_drv.sv @@ -0,0 +1,62 @@ +// Copyright 2023 OpenHW Group +// Copyright 2023 Datum Technology Corporation +// Copyright 2023 Silicon Labs, Inc. +// +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://solderpad.org/licenses/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +`ifndef __UVMA_CVA6_CORE_CNTRL_DRV_SV__ +`define __UVMA_CVA6_CORE_CNTRL_DRV_SV__ + +/** + * Component driving bootstrap pins and other misecllaneous I/O for cva6 core + */ +class uvma_cva6_core_cntrl_drv_c extends uvma_core_cntrl_drv_c; + + `uvm_component_utils_begin(uvma_cva6_core_cntrl_drv_c) + `uvm_component_utils_end + + /** + * Default constructor. + */ + extern function new(string name="uvma_cva6_core_cntrl_drv", uvm_component parent=null); + + extern task drive_bootstrap(); + +endclass : uvma_cva6_core_cntrl_drv_c + +function uvma_cva6_core_cntrl_drv_c::new(string name="uvma_cva6_core_cntrl_drv", uvm_component parent=null); + + super.new(name, parent); + +endfunction : new + +task uvma_cva6_core_cntrl_drv_c::drive_bootstrap(); + + uvma_cva6_core_cntrl_cntxt_c cva6_cntxt; + + $cast(cva6_cntxt, cntxt); + + cva6_cntxt.core_cntrl_vif.boot_addr = cfg.boot_addr; + cva6_cntxt.core_cntrl_vif.nmi_addr = cfg.nmi_addr; + cva6_cntxt.core_cntrl_vif.mtvec_addr = cfg.mtvec_addr; + cva6_cntxt.core_cntrl_vif.dm_halt_addr = cfg.dm_halt_addr; + cva6_cntxt.core_cntrl_vif.dm_exception_addr = cfg.dm_exception_addr; + cva6_cntxt.core_cntrl_vif.mhartid = cfg.mhartid; + cva6_cntxt.core_cntrl_vif.mimpid = cfg.mimpid; + cva6_cntxt.core_cntrl_vif.fetch_en = 1'b0; + cva6_cntxt.core_cntrl_vif.scan_cg_en = 1'b0; + +endtask : drive_bootstrap + +`endif // __UVMA_CVA6_CORE_CNTRL_DRV_SV__ diff --git a/cva6/env/uvme/uvme_cva6_cfg.sv b/cva6/env/uvme/uvme_cva6_cfg.sv index 726de70ea..36a0e7c18 100644 --- a/cva6/env/uvme/uvme_cva6_cfg.sv +++ b/cva6/env/uvme/uvme_cva6_cfg.sv @@ -26,11 +26,10 @@ * Object encapsulating all parameters for creating, connecting and running * CVA6 environment (uvme_cva6_env_c) components. */ -class uvme_cva6_cfg_c extends uvm_object; +class uvme_cva6_cfg_c extends uvma_core_cntrl_cfg_c; // Integrals rand bit enabled; - rand uvm_active_passive_enum is_active; rand bit scoreboarding_enabled; rand bit cov_model_enabled; @@ -61,13 +60,68 @@ class uvme_cva6_cfg_c extends uvm_object; constraint defaults_cons { soft enabled == 0; - soft is_active == UVM_PASSIVE; + soft is_active == UVM_ACTIVE; soft scoreboarding_enabled == 1; soft cov_model_enabled == 1; soft trn_log_enabled == 1; soft sys_clk_period == uvme_cva6_sys_default_clk_period; // see uvme_cva6_constants.sv } + constraint cva6_riscv_cons { + xlen == uvma_core_cntrl_pkg::MXL_32; + ilen == 32; + + ext_i_supported == 1; + ext_a_supported == 0; + ext_m_supported == 1; + ext_c_supported == 1; + ext_p_supported == 0; + ext_v_supported == 0; + ext_f_supported == 0; + ext_d_supported == 0; + ext_zba_supported == 0; + ext_zbb_supported == 0; + ext_zbc_supported == 0; + ext_zbe_supported == 0; + ext_zbf_supported == 0; + ext_zbm_supported == 0; + ext_zbp_supported == 0; + ext_zbr_supported == 0; + ext_zbs_supported == 0; + ext_zbt_supported == 0; + ext_zifencei_supported == 1; + ext_zicsr_supported == 1; + + mode_s_supported == 0; + mode_u_supported == 0; + + pmp_supported == 0; + debug_supported == 1; + + unaligned_access_supported == 1; + unaligned_access_amo_supported == 0; + + bitmanip_version == BITMANIP_VERSION_1P00; + priv_spec_version == PRIV_VERSION_MASTER; + endianness == ENDIAN_LITTLE; + + boot_addr_valid == 1; + mtvec_addr_valid == 1; + dm_halt_addr_valid == 1; + dm_exception_addr_valid == 1; + nmi_addr_valid == 1; + } + + constraint default_cva6_boot_cons { + (!mhartid_plusarg_valid) -> (mhartid == 'h0000_0000); + (!mimpid_plusarg_valid) -> (mimpid == 'h0000_0000); + (!boot_addr_plusarg_valid) -> (boot_addr == 'h8000_0000); + (!mtvec_addr_plusarg_valid) -> (mtvec_addr == 'h0000_0000); + (!nmi_addr_plusarg_valid) -> (nmi_addr == 'h0000_0000); + (!dm_halt_addr_plusarg_valid) -> (dm_halt_addr == 'h0000_0000); + (!dm_exception_addr_plusarg_valid) -> (dm_exception_addr == 'h0000_0000); + } + constraint agent_cfg_cons { if (enabled) { clknrst_cfg.enabled == 1; @@ -93,6 +147,11 @@ class uvme_cva6_cfg_c extends uvm_object; */ extern function new(string name="uvme_cva6_cfg"); + /** + * Sample the parameters of the DUT via the virtual interface in a context + */ + extern virtual function void sample_parameters(uvma_core_cntrl_cntxt_c cntxt); + endclass : uvme_cva6_cfg_c @@ -106,5 +165,34 @@ function uvme_cva6_cfg_c::new(string name="uvme_cva6_cfg"); endfunction : new +function void uvme_cva6_cfg_c::sample_parameters(uvma_core_cntrl_cntxt_c cntxt); + + uvma_cva6_core_cntrl_cntxt_c cva6_cntxt; + + if (!$cast(cva6_cntxt, cntxt)) begin + `uvm_fatal("SAMPLECNTXT", "Could not cast cntxt to uvma_cva6_core_cntrl_cntxt_c"); + end + + + num_mhpmcounters = cva6_cntxt.core_cntrl_vif.num_mhpmcounters; + // TODO : Check PMA + //~ pma_regions = new[cva6_cntxt.core_cntrl_vif.pma_cfg.size()]; + + //~ foreach (pma_regions[i]) begin + //~ pma_regions[i] = uvma_core_cntrl_pma_region_c::type_id::create($sformatf("pma_region%0d", i)); + //~ pma_regions[i].word_addr_low = cva6_cntxt.core_cntrl_vif.pma_cfg[i].word_addr_low; + //~ pma_regions[i].word_addr_high = cva6_cntxt.core_cntrl_vif.pma_cfg[i].word_addr_high; + //~ pma_regions[i].main = cva6_cntxt.core_cntrl_vif.pma_cfg[i].main; + //~ pma_regions[i].bufferable = core_cntrl_vif.pma_cfg[i].bufferable; + //~ pma_regions[i].cacheable = core_cntrl_vif.pma_cfg[i].cacheable; + //~ pma_regions[i].atomic = core_cntrl_vif.pma_cfg[i].atomic; + //~ end + + //~ // Copy to the pma_configuration + //~ pma_cfg.regions = new[pma_regions.size()]; + //~ foreach (pma_cfg.regions[i]) + //~ pma_cfg.regions[i] = pma_regions[i]; + +endfunction : sample_parameters `endif // __UVME_CVA6_CFG_SV__ diff --git a/cva6/env/uvme/uvme_cva6_cntxt.sv b/cva6/env/uvme/uvme_cva6_cntxt.sv index 5a4433661..01ea415f0 100644 --- a/cva6/env/uvme/uvme_cva6_cntxt.sv +++ b/cva6/env/uvme/uvme_cva6_cntxt.sv @@ -31,6 +31,7 @@ class uvme_cva6_cntxt_c extends uvm_object; uvma_clknrst_cntxt_c clknrst_cntxt; uvma_cvxif_cntxt_c cvxif_cntxt; uvma_axi_cntxt_c axi_cntxt; + uvma_cva6_core_cntrl_cntxt_c core_cntrl_cntxt; // Memory modelling rand uvml_mem_c mem; @@ -43,6 +44,7 @@ class uvme_cva6_cntxt_c extends uvm_object; `uvm_object_utils_begin(uvme_cva6_cntxt_c) `uvm_field_object(clknrst_cntxt, UVM_DEFAULT) `uvm_field_object(axi_cntxt, UVM_DEFAULT) + `uvm_field_object(core_cntrl_cntxt, UVM_DEFAULT) `uvm_field_event(sample_cfg_e , UVM_DEFAULT) `uvm_field_event(sample_cntxt_e, UVM_DEFAULT) `uvm_field_object(mem, UVM_DEFAULT) @@ -65,6 +67,7 @@ function uvme_cva6_cntxt_c::new(string name="uvme_cva6_cntxt"); super.new(name); clknrst_cntxt = uvma_clknrst_cntxt_c::type_id::create("clknrst_cntxt"); + core_cntrl_cntxt = uvma_cva6_core_cntrl_cntxt_c::type_id::create("core_cntrl_cntxt"); axi_cntxt = uvma_axi_cntxt_c::type_id::create("axi_cntxt"); mem = uvml_mem_c::type_id::create("mem"); diff --git a/cva6/env/uvme/uvme_cva6_constants.sv b/cva6/env/uvme/uvme_cva6_constants.sv index 083a2296d..c77ec8374 100644 --- a/cva6/env/uvme/uvme_cva6_constants.sv +++ b/cva6/env/uvme/uvme_cva6_constants.sv @@ -24,5 +24,7 @@ parameter uvme_cva6_sys_default_clk_period = 1_500; // 10ns parameter uvme_cva6_debug_default_clk_period = 10_000; // 10ns +parameter XLEN = 32; +parameter ILEN = 32; `endif // __UVME_CVA6_CONSTANTS_SV__ diff --git a/cva6/env/uvme/uvme_cva6_core_cntrl_if.sv b/cva6/env/uvme/uvme_cva6_core_cntrl_if.sv new file mode 100644 index 000000000..e8e32e340 --- /dev/null +++ b/cva6/env/uvme/uvme_cva6_core_cntrl_if.sv @@ -0,0 +1,31 @@ +/** + * Quasi-static core control signals. + */ +interface uvme_cva6_core_cntrl_if + import uvm_pkg::*; + import uvme_cva6_pkg::*; + (); + + logic clk; + logic fetch_en; + + logic scan_cg_en; + logic [XLEN-1:0] boot_addr; + logic [XLEN-1:0] mtvec_addr; + logic [XLEN-1:0] dm_halt_addr; + logic [XLEN-1:0] dm_exception_addr; + logic [XLEN-1:0] nmi_addr; + logic [XLEN-1:0] mhartid; + logic [XLEN-1:0] mimpid; + + logic [XLEN-1:0] num_mhpmcounters; + //~ pma_region_t pma_cfg[]; + + // Testcase asserts this to load memory (not really a core control signal) + logic load_instr_mem; + + clocking drv_cb @(posedge clk); + output fetch_en; + endclocking : drv_cb + +endinterface : uvme_cva6_core_cntrl_if diff --git a/cva6/env/uvme/uvme_cva6_env.sv b/cva6/env/uvme/uvme_cva6_env.sv index 008abaa12..b22e45ff6 100644 --- a/cva6/env/uvme/uvme_cva6_env.sv +++ b/cva6/env/uvme/uvme_cva6_env.sv @@ -42,7 +42,7 @@ class uvme_cva6_env_c extends uvm_env; uvma_clknrst_agent_c clknrst_agent; uvma_cvxif_agent_c cvxif_agent; uvma_axi_agent_c axi_agent; - + uvma_cva6_core_cntrl_agent_c core_cntrl_agent; `uvm_component_utils_begin(uvme_cva6_env_c) @@ -205,6 +205,8 @@ function void uvme_cva6_env_c::assign_cfg(); uvm_config_db#(uvma_axi_cfg_c)::set(this, "*axi_agent", "cfg", cfg.axi_cfg); + uvm_config_db#(uvma_core_cntrl_cfg_c)::set(this, "core_cntrl_agent", "cfg", cfg); + endfunction: assign_cfg @@ -222,6 +224,7 @@ function void uvme_cva6_env_c::create_agents(); clknrst_agent = uvma_clknrst_agent_c::type_id::create("clknrst_agent", this); cvxif_agent = uvma_cvxif_agent_c::type_id::create("cvxif_agent", this); axi_agent = uvma_axi_agent_c::type_id::create("axi_agent", this); + core_cntrl_agent = uvma_cva6_core_cntrl_agent_c::type_id::create("core_cntrl_agent", this); endfunction: create_agents diff --git a/cva6/env/uvme/uvme_cva6_pkg.sv b/cva6/env/uvme/uvme_cva6_pkg.sv index 52876c643..8415dd058 100644 --- a/cva6/env/uvme/uvme_cva6_pkg.sv +++ b/cva6/env/uvme/uvme_cva6_pkg.sv @@ -45,12 +45,14 @@ package uvme_cva6_pkg; import uvma_cvxif_pkg::*; import uvma_axi_pkg::*; import uvml_mem_pkg ::*; + import uvma_core_cntrl_pkg::*; // Constants / Structs / Enums `include "uvme_cva6_constants.sv" `include "uvme_cva6_tdefs.sv" // Objects + `include "uvma_cva6_core_cntrl_cntxt.sv" `include "uvme_cva6_cfg.sv" `include "uvme_cva6_cntxt.sv" @@ -58,6 +60,8 @@ package uvme_cva6_pkg; `include "uvme_cva6_prd.sv" // Environment components + `include "uvma_cva6_core_cntrl_drv.sv" + `include "uvma_cva6_core_cntrl_agent.sv" `include "uvme_cva6_sb.sv" `include "uvme_cva6_vsqr.sv" `include "uvme_cvxif_covg.sv" @@ -70,9 +74,8 @@ package uvme_cva6_pkg; // `include "uvme_cva6_interrupt_noise_vseq.sv" `include "uvme_cva6_vseq_lib.sv" - - endpackage : uvme_cva6_pkg +`include "uvme_cva6_core_cntrl_if.sv" `endif // __UVME_CVA6_PKG_SV__ diff --git a/cva6/sim/Makefile b/cva6/sim/Makefile index ffaa29f1b..27e7af7e8 100644 --- a/cva6/sim/Makefile +++ b/cva6/sim/Makefile @@ -137,6 +137,7 @@ export CV_CORE_UC = CVA6 export DV_UVMT_PATH = $(CORE_V_VERIF)/$(CV_CORE_LC)/tb/uvmt export DV_UVME_PATH = $(CORE_V_VERIF)/$(CV_CORE_LC)/env/uvme export DV_UVML_HRTBT_PATH = $(CORE_V_VERIF)/lib/uvm_libs/uvml_hrtbt +export DV_UVMA_CORE_CNTRL_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_core_cntrl export DV_UVMA_ISACOV_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_isacov export DV_UVMA_CLKNRST_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_clknrst export DV_UVMA_CVXIF_PATH = $(CORE_V_VERIF)/lib/uvm_agents/uvma_cvxif diff --git a/cva6/tb/uvmt/cva6_tb_wrapper.sv b/cva6/tb/uvmt/cva6_tb_wrapper.sv index c94be22f1..e0ad93203 100644 --- a/cva6/tb/uvmt/cva6_tb_wrapper.sv +++ b/cva6/tb/uvmt/cva6_tb_wrapper.sv @@ -34,7 +34,9 @@ import "DPI-C" function read_elf(input string filename); import "DPI-C" function byte get_section(output longint address, output longint len); import "DPI-C" context function void read_section(input longint address, inout byte buffer[]); -module cva6_tb_wrapper #( +module cva6_tb_wrapper + import uvmt_cva6_pkg::*; +#( parameter int unsigned AXI_USER_WIDTH = 1, parameter int unsigned AXI_USER_EN = 0, parameter int unsigned AXI_ADDRESS_WIDTH = 64, @@ -43,6 +45,7 @@ module cva6_tb_wrapper #( ) ( input logic clk_i, input logic rst_ni, + input logic [XLEN-1:0] boot_addr_i, output wire tb_exit_o, output ariane_rvfi_pkg::rvfi_port_t rvfi_o, input cvxif_pkg::cvxif_resp_t cvxif_resp, @@ -64,7 +67,7 @@ module cva6_tb_wrapper #( ) i_cva6 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - .boot_addr_i ( 64'h0000_0000_8000_0000 ), //ariane_soc::ROMBase + .boot_addr_i ( boot_addr_i ),//Driving the boot_addr value from the core control agent .hart_id_i ( 64'h0000_0000_0000_0000 ), .irq_i ( 2'b00 /*irqs*/ ), .ipi_i ( 1'b0 /*ipi*/ ), diff --git a/cva6/tb/uvmt/uvmt_cva6.flist b/cva6/tb/uvmt/uvmt_cva6.flist index a805b6b3a..7579275ec 100644 --- a/cva6/tb/uvmt/uvmt_cva6.flist +++ b/cva6/tb/uvmt/uvmt_cva6.flist @@ -25,6 +25,7 @@ -f ${DV_UVMA_CLKNRST_PATH}/uvma_clknrst_pkg.flist -f ${DV_UVMA_CVXIF_PATH}/src/uvma_cvxif_pkg.flist -f ${DV_UVMA_AXI_PATH}/src/uvma_axi_pkg.flist +-f ${DV_UVMA_CORE_CNTRL_PATH}/uvma_core_cntrl_pkg.flist // Environments -f ${CVA6_UVME_PATH}/uvme_cva6_pkg.flist diff --git a/cva6/tb/uvmt/uvmt_cva6_constants.sv b/cva6/tb/uvmt/uvmt_cva6_constants.sv index fd7d19012..94d0f8e1a 100644 --- a/cva6/tb/uvmt/uvmt_cva6_constants.sv +++ b/cva6/tb/uvmt/uvmt_cva6_constants.sv @@ -19,5 +19,6 @@ `ifndef __UVMT_CVA6_CONSTANTS_SV__ `define __UVMT_CVA6_CONSTANTS_SV__ +parameter XLEN = 32; `endif // __UVMT_CVA6_CONSTANTS_SV__ diff --git a/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv b/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv index 973c8e7db..0d41676d8 100644 --- a/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv +++ b/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv @@ -25,6 +25,7 @@ module uvmt_cva6_dut_wrap # ( parameter int unsigned AXI_USER_WIDTH = 1, uvma_clknrst_if clknrst_if, uvma_cvxif_intf cvxif_if, uvma_axi_intf axi_if, + uvme_cva6_core_cntrl_if core_cntrl_if, output wire tb_exit_o, output ariane_rvfi_pkg::rvfi_port_t rvfi_o ); @@ -41,6 +42,7 @@ module uvmt_cva6_dut_wrap # ( parameter int unsigned AXI_USER_WIDTH = 1, cva6_tb_wrapper_i ( .clk_i ( clknrst_if.clk ), .rst_ni ( clknrst_if.reset_n ), + .boot_addr_i ( core_cntrl_if.boot_addr ), .cvxif_resp ( cvxif_if.cvxif_resp_o ), .cvxif_req ( cvxif_if.cvxif_req_i ), .axi_slave ( axi_if ), diff --git a/cva6/tb/uvmt/uvmt_cva6_tb.sv b/cva6/tb/uvmt/uvmt_cva6_tb.sv index 393c2bf9c..b2d2ca1fd 100644 --- a/cva6/tb/uvmt/uvmt_cva6_tb.sv +++ b/cva6/tb/uvmt/uvmt_cva6_tb.sv @@ -51,6 +51,7 @@ module uvmt_cva6_tb; .clk(clknrst_if.clk), .rst_n(clknrst_if.reset_n) ); + uvme_cva6_core_cntrl_if core_cntrl_if(); //bind assertion module for cvxif interface bind uvmt_cva6_dut_wrap @@ -83,6 +84,7 @@ module uvmt_cva6_tb; .clknrst_if(clknrst_if), .cvxif_if (cvxif_if), .axi_if (axi_if), + .core_cntrl_if(core_cntrl_if), .tb_exit_o(), .rvfi_o(rvfi_if.rvfi_o) ); @@ -101,6 +103,7 @@ module uvmt_cva6_tb; uvm_config_db#(virtual uvma_cvxif_intf )::set(.cntxt(null), .inst_name("*.env.cvxif_agent"), .field_name("vif"), .value(cvxif_if) ); uvm_config_db#(virtual uvma_axi_intf )::set(.cntxt(null), .inst_name("*"), .field_name("axi_vif"), .value(axi_if)); uvm_config_db#(virtual uvmt_rvfi_if )::set(.cntxt(null), .inst_name("*"), .field_name("rvfi_vif"), .value(rvfi_if)); + uvm_config_db#(virtual uvme_cva6_core_cntrl_if)::set(.cntxt(null), .inst_name("*"), .field_name("core_cntrl_vif"), .value(core_cntrl_if)); // DUT and ENV parameters uvm_config_db#(int)::set(.cntxt(null), .inst_name("*"), .field_name("ENV_PARAM_INSTR_ADDR_WIDTH"), .value(ENV_PARAM_INSTR_ADDR_WIDTH) ); @@ -113,6 +116,8 @@ module uvmt_cva6_tb; uvm_top.run_test(); end : test_bench_entry_point + assign core_cntrl_if.clk = clknrst_if.clk; + /** * End-of-test summary printout. */ From 2768a433ac49ba93f3ecd9035508495effcbb5e4 Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Fri, 24 Feb 2023 17:42:13 +0100 Subject: [PATCH 048/183] [VPTOOL] Improve Python dependency handling, update DV plan launch scripts. * cva6/docs/VerifPlans/AXI/runme.sh: Call the VPTOOL shell wrapper. * cva6/docs/VerifPlans/CVXIF/runme.sh: Ditto. Pass cmdline options to shell wrapper. * cva6/docs/VerifPlans/FRONTEND/runme.sh: Call the VPTOOL shell wrapper. * cva6/docs/VerifPlans/ISA_RV32/runme.sh: Ditto. * cva6/docs/VerifPlans/install-prerequisites.sh: Use 'requirements.txt' and PIP to install Python dependencies. * tools/vptool/README.md: Update wrt. new Yaml library. Update name of the README file. * tools/vptool/vptool.sh: New shell wrapper to transparently handle Python dependencies. * tools/vptool/vptool/requirements.txt: New. * tools/vptool/vptool/vp.py (toplevel): Remove unused PyYaml imports. Signed-off-by: Zbigniew Chamski --- cva6/docs/VerifPlans/AXI/runme.sh | 2 +- cva6/docs/VerifPlans/CVXIF/runme.sh | 2 +- cva6/docs/VerifPlans/FRONTEND/runme.sh | 2 +- cva6/docs/VerifPlans/ISA_RV32/runme.sh | 2 +- cva6/docs/VerifPlans/install-prerequisites.sh | 4 +-- tools/vptool/README.md | 5 ++-- tools/vptool/vptool.sh | 29 +++++++++++++++++++ tools/vptool/vptool/requirements.txt | 3 ++ tools/vptool/vptool/vp.py | 5 ---- 9 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 tools/vptool/vptool.sh create mode 100644 tools/vptool/vptool/requirements.txt diff --git a/cva6/docs/VerifPlans/AXI/runme.sh b/cva6/docs/VerifPlans/AXI/runme.sh index b0cfce34d..e2cfd351f 100644 --- a/cva6/docs/VerifPlans/AXI/runme.sh +++ b/cva6/docs/VerifPlans/AXI/runme.sh @@ -31,4 +31,4 @@ export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` # FIXME: Introduce a suitably named shell variable that points to the root # directory of the tool set (TOOL_TOP etc.) # FORNOW use a hardcoded relative path. -python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py $* +sh $ROOTDIR/../../../../tools/vptool/vptool.sh $* diff --git a/cva6/docs/VerifPlans/CVXIF/runme.sh b/cva6/docs/VerifPlans/CVXIF/runme.sh index f1be65625..1701a0ebe 100644 --- a/cva6/docs/VerifPlans/CVXIF/runme.sh +++ b/cva6/docs/VerifPlans/CVXIF/runme.sh @@ -31,4 +31,4 @@ export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` # FIXME: Introduce a suitably named shell variable that points to the root # directory of the tool set (TOOL_TOP etc.) # FORNOW use a hardcoded relative path. -python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py -t winxpblue +sh $ROOTDIR/../../../../tools/vptool/vptool.sh $* diff --git a/cva6/docs/VerifPlans/FRONTEND/runme.sh b/cva6/docs/VerifPlans/FRONTEND/runme.sh index fb0023f98..b808624f8 100644 --- a/cva6/docs/VerifPlans/FRONTEND/runme.sh +++ b/cva6/docs/VerifPlans/FRONTEND/runme.sh @@ -31,4 +31,4 @@ export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` # FIXME: Introduce a suitably named shell variable that points to the root # directory of the tool set (TOOL_TOP etc.) # FORNOW use a hardcoded relative path. -python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py $* +sh $ROOTDIR/../../../../tools/vptool/vptool.sh $* diff --git a/cva6/docs/VerifPlans/ISA_RV32/runme.sh b/cva6/docs/VerifPlans/ISA_RV32/runme.sh index 0af7efb8d..5c581f0d5 100644 --- a/cva6/docs/VerifPlans/ISA_RV32/runme.sh +++ b/cva6/docs/VerifPlans/ISA_RV32/runme.sh @@ -31,4 +31,4 @@ export MARKDOWN_OUTPUT_DIR=`readlink -f "$ROOTDIR/../source"` # FIXME: Introduce a suitably named shell variable that points to the root # directory of the tool set (TOOL_TOP etc.) # FORNOW use a hardcoded relative path. -python3 $ROOTDIR/../../../../tools/vptool/vptool/vp.py $* +sh $ROOTDIR/../../../../tools/vptool/vptool.sh $* diff --git a/cva6/docs/VerifPlans/install-prerequisites.sh b/cva6/docs/VerifPlans/install-prerequisites.sh index 65a4d5642..f73a1fc76 100644 --- a/cva6/docs/VerifPlans/install-prerequisites.sh +++ b/cva6/docs/VerifPlans/install-prerequisites.sh @@ -10,9 +10,7 @@ # Make sure all necessary components are installed/available. # # Install Python dependencies. -for REQT in `cat requirements.txt` ; do - python3 -m pip install $REQT -done +python3 -m pip install -q -r $(dirname $(readlink -f $0))/requirements.txt # Check for a LaTeX installation. which latex > /dev/null || { \ diff --git a/tools/vptool/README.md b/tools/vptool/README.md index be78643b5..21adccb57 100644 --- a/tools/vptool/README.md +++ b/tools/vptool/README.md @@ -39,7 +39,8 @@ If you encounter a problem with VPTOOL, please open an issue on this repository use `sudo apt-get install python3-tk`. On RedHat-based systems (RedHat/CentOS/Fedora), use `sudo dnf install python3-tkinter` or `sudo yum install python3-tkinter`, as appropriate. -* PyYAML: a YAML I/O library for Python. Install using `pip3 install --upgrade pyyaml`. +* Ruamel YAML: a YAML I/O library for Python with round-trip parse/unparse capabilities. + Install using `pip3 install --upgrade ruamel.yaml`. * Pillow: A replacement for the original PIL (Python Image Library). Install using `pip3 install --upgrade pillow`. @@ -86,7 +87,7 @@ shell script named `vptool-example.sh` which can be invoked from any location. ### Directory structure -- VPTOOL-readme.txt this file +- README.md this file - vptool the code of `VPTOOL` - vptool-example an example of `VPTOOL` configuration with a verification database - runme.sh a shell script to run `VPTOOL` with the example database diff --git a/tools/vptool/vptool.sh b/tools/vptool/vptool.sh new file mode 100644 index 000000000..bf453ca16 --- /dev/null +++ b/tools/vptool/vptool.sh @@ -0,0 +1,29 @@ +############################################################################# +# Copyright (C) 2023 Thales DIS France SAS +# +# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0. +# +# Original Author: Zbigniew Chamski (zbigniew.chamski@thalesgroup.com) +############################################################################# +#!/bin/sh + +# Set the canonical path of the current script. +VPTOOL_DIR=$(dirname $(readlink -f $0)) + +# Install any missing dependencies. +# - check if tkinter module is available (its installation requires super-user privileges.) +# If not, provide installation hints. +echo "import tkinter" | python3 || \ +{ + echo "*** Missing system-wide dependency: Python3 module 'tkinter' not installed." + echo "*** Please ask your administrator to install the required package:" + echo "*** - Debian, Ubuntu: 'python3-tk'" + echo "*** - RedHat EL, CentOS, Fedora: 'python3-tkinter'" + exit 1; +} + +# - install Python3 required modules in user space. +python3 -m pip install -q -r $VPTOOL_DIR/vptool/requirements.txt + +# Run VPTOOL with the arguments as supplied by the caller. +python3 $VPTOOL_DIR/vptool/vp.py $* diff --git a/tools/vptool/vptool/requirements.txt b/tools/vptool/vptool/requirements.txt new file mode 100644 index 000000000..c024b2c62 --- /dev/null +++ b/tools/vptool/vptool/requirements.txt @@ -0,0 +1,3 @@ +ruamel.yaml>=0.16 +pillow +ttkthemes diff --git a/tools/vptool/vptool/vp.py b/tools/vptool/vptool/vp.py index 03047594b..b0efb3ae3 100755 --- a/tools/vptool/vptool/vp.py +++ b/tools/vptool/vptool/vp.py @@ -39,11 +39,6 @@ from PIL import Image, ImageTk import shutil import hashlib -try: - from yaml import CLoader as Loader, CDumper as Dumper -except ImportError: - from yaml import Loader, Dumper - global ip_list # Dict Containing IPs->Prop->item. Eventually, it contains the whole DB global MASTER_LABEL_COLOR, SECONDARY_LABEL_COLOR, TERTIARY_LABEL_COLOR, BG_COLOR, LOCK_COLOR global CUSTOM_NUM From b9c4f99ebad4a20cb824855967d095041fd201fc Mon Sep 17 00:00:00 2001 From: Zbigniew Chamski Date: Mon, 27 Feb 2023 12:18:55 +0100 Subject: [PATCH 049/183] Improve handling of dependencies for publishing VPTOOL verification plans. * cva6/docs/VerifPlans/install-prerequisites.sh: Improve invocation from arbitrary directories>. Add better diagnostics. Add final success msg. Signed-off-by: Zbigniew Chamski --- cva6/docs/VerifPlans/install-prerequisites.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cva6/docs/VerifPlans/install-prerequisites.sh b/cva6/docs/VerifPlans/install-prerequisites.sh index f73a1fc76..b8f169bb7 100644 --- a/cva6/docs/VerifPlans/install-prerequisites.sh +++ b/cva6/docs/VerifPlans/install-prerequisites.sh @@ -9,17 +9,29 @@ ############################################################################# # Make sure all necessary components are installed/available. # -# Install Python dependencies. +# Install Python dependencies. We can extract the full path of the script only +# when invoked using '$SHELL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-
-
- -
-
- -
-
- Metrics Report Generate on 2020/11/03 08:34:26 -
- - - -
- -
- -
-
- -
- - - - - - - - - - - - - - -

Version: IMC: 20.07-a001: (c) Copyright 1995-2020 Cadence Design Systems Inc

-
- -

Metrics tree View Name: CV32E40P

-

Block View Name: Uncovered

-

Expression View Name: Uncovered

- - -

FSM View Name: FSM

-

Cover group View Name: CoverGroups

-

Assertion View Name: Assertions

- - -
- -
-
-
- - -
-
- -

- - - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - - UNR - - - Index - - - Block Type - - - Source Line - - - Score - - - Overall Average Grade - - - Enclosing Entity - - - Source Code - -
-
- -
-
-
-
- -

- - - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - Index - - Overall Average Grade - - Overall Covered - - Source Line - - Enclosing Entity - - Source Code -
- -
-
-
- -

- - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - Index - - Overall Average Grade - - Overall Covered -
- -
-
- -
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - UNR - - No attribute - - Score - - Output -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - UNR - - No attribute - - Score - - Output -
-
- -
-
- -

- -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - Exp - - Score - - Odd - - Even -
- -
- - -
- -
- - - - - - -
- -
-
- -

- - - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - - UNR - - - Name - - - State Average Grade - - - Transition Average Grade - - - Arc Average Grade - - - Enclosing Entity - - - Source Code - -
- -
- -
-
-
- -

- - - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - UNR - - Name - - Encoding - - Score - - Is Reset State - - Source Code -
-
-
-
- -

- - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - UNR - - Index - - From State Name - - To State Name - - Score - - Is Reset Trans -
- - -
- -
-
- -

- - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - Input Signal Names - - UNR - - Score -
-
- - -
- -
- - -
- ============================= -
-
- -

- - - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - - UNR - - - Name - - - Overall Average Grade - - - Overall Covered - - - Enclosing Entity - - - Source Code - -
-
-
-
- -

- - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - UNR - - Name - - At Least - - Overall Average Grade - - Overall Covered - - Source Code -
-
- -
-
- -

- - - - - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - UNR - - Name - - Overall Average Grade - - Overall Covered - - Score - - At Least - - Source Code -
- - -
- - -
- - -
- - -
- -

- - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - - UNR - - - Name - - - Overall Average Grade - - - Assertion Status Grade - - - Enclosing Entity - - - Source Code - -
-
- - - - - -
- -
- - - -
-
-
-
-

- - - - - - - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exclusion Rule Type - - - UNR - - - Name - - - Block Covered - - - Expression Covered - - - FSM Covered - - - CoverGroup Covered - - - Assertion Covered - -
- - -
-
-
- - - - diff --git a/docs/Reports/cv32e40p/2020-11-02/resources/cdnlogo.png b/docs/Reports/cv32e40p/2020-11-02/resources/cdnlogo.png deleted file mode 100644 index 7381b7d982c84a7fbac26844eee7ca6b89fc3f76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54812 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 bWY!^eB%`1)j->Y%!DD;+tW}vsz^#7+#H@h` diff --git a/docs/Reports/cv32e40p/2020-11-02/resources/imc.css b/docs/Reports/cv32e40p/2020-11-02/resources/imc.css deleted file mode 100644 index e78cfe629..000000000 --- a/docs/Reports/cv32e40p/2020-11-02/resources/imc.css +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Contains css settings used by the browser to display html reports. - * Can be modified to customize the setings for fonts, text and colors. -*/ - -/* Overall setting for HTML page - * font-size can addded to change the size of fonts for the complete page. -*/ -body { - font-family: sans-serif; - color: black; - text-indent: 0; - background-color: white; -} - -p.fs { - font-size: 0.8em; - font-family: sans-serif; -} - -table.print-friendly tr td, table.print-friendly tr th { - page-break-inside: avoid; -} - -table.summary_table { - font-size: 0.8em; - font-family: sans-serif; - border-spacing: 0px; - border-width: 1px; - border-style: none; - border-color: black; -} - -table.info_header, table.info_header_aligned { - font-size: 0.8em; - font-family: sans-serif; - border-spacing: 0px; - border-width: 1px; - border-style: none; - border-color: black; -} - -table.info_header_aligned { - width: 80%; -} - -table.detail_header { - font-size: 0.8em; - font-family: sans-serif; - border-spacing: 0px; - border-width: 1; - border-style: solid; - border-color: black; -} - -td.summary { - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -th.summary { - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -tr.summary { - text-align: left; -} - -tr.detail { - text-align: left; -} - -A:link { - color: blue; -} - -A:active { - color: blue; - outline: none; -} - -A:visited { - color: darkred; -} - -A:hover { - color: red; -} - -A:focus { - -moz-outline-style: none; -} - -p.title { - font-size: large; - font-weight: BOLD; - color: BLACK; - font-family: sans-serif; -} - -p.summary_title { - background-color: ff6666; - font-size: medium; - font-weight: BOLD; - color: BLACK; - font-family: sans-serif; -} - -p.detail_title { - background-color: ff6666; - font-size: medium; - font-weight: BOLD; - color: BLACK; - font-family: sans-serif; -} - -p.subtitle { - font-size: small; - font-weight: BOLD; - color: BLACK; - font-family: sans-serif; -} - -p.section { - font-size: medium; - text-decoration: underline; - font-weight: BOLD; - color: BLACK; - font-family: sans-serif; -} - -/* Name field of summary tables */ -.namecell, .BOOLEAN_cell, .ENUM_cell, .STRING_cell, .DATE_cell, .UNSIGNED_INT_cell, .UNSIGNED_LONG_cell, .DOUBLE_cell, .namecellHeaderLine { - background-color: white; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; - min-width: 100px; -} - -.FILE_cell { - - background-color: white; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; - max-width: 300px; - min-width: 200px; - word-wrap: break-word; - word-break: break-all; - /*white-space: normal*/ -} - -.namecellHeaderLine { - width: 8%; -} - -/* data cell field of summary tables depending on the value of data cell */ -.rangenone { - background-color: cccccc; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range0 { - background-color: ff6666; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range01to04 { - background-color: ff9999; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range05to09 { - background-color: ff9999; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range10to14 { - background-color: ff9999; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range15to19 { - background-color: ff9999; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range20to24 { - background-color: ff9999; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range25to29 { - background-color: ffcc99; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range30to34 { - background-color: ffcc99; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range35to39 { - background-color: ffcc99; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range40to44 { - background-color: ffcc99; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range45to49 { - background-color: ffcc99; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range50to54 { - background-color: ffff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range55to59 { - background-color: ffff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range60to64 { - background-color: ffff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range65to69 { - background-color: ffff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range70to74 { - background-color: ffff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range75to79 { - background-color: #99ff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range80to84 { - background-color: #99ff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range85to89 { - background-color: #99ff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range90to94 { - background-color: #99ff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range95to99 { - background-color: #99ff66; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -.range100 { - background-color: #33cc00; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -a.sht:link { - text-decoration: none; - color: blue; -} - -a.sht:active { - text-decoration: none; - color: blue; - outline: none; -} - -a.sht:visited { - text-decoration: none; - color: blue; -} - -a.sht:hover { - text-decoration: none; - color: red; -} - -a.sht:focus { - -moz-outline-style: none; -} - -a.namet:link { - text-decoration: none; - color: blue; -} - -a.namet:active { - text-decoration: none; - color: blue; - outline: none; -} - -a.namet:visited { - text-decoration: none; - color: blue; -} - -a.namet:hover { - text-decoration: none; - color: blue; -} - -a.namet:focus { - -moz-outline-style: none; -} - -.wht { - background-color: #609acc; - color: #ffffff; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - width: 6em; - text-align: left; -} - -.wht_wide { - background-color: #609acc; - padding: 0px 4px 1px 4px; - color: #ffffff; - border-style: solid; - border-color: black; - border-width: 1px; - width: 24em; - text-align: left; -} - -.wht_wider { - background-color: #609acc; - color: #ffffff; - padding: 0px 4px 1px 4px; - border-style: solid; - border-color: black; - border-width: 1px; - text-align: left; -} - -/* Font used to generate detail report text */ -pre.detail_report_text { - font-family: Courier; - font-size: 0.8em; -} - -.tooltip { - color: #000000; - outline: none; - cursor: help; - text-decoration: none; - position: relative; - color: #FFFFFF; -} - -.tooltip span { - margin-left: -999em; - position: absolute; - display: none; -} - -.tooltip:hover span { - border-radius: 5px 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); - -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); - font-family: Calibri, Tahoma, Geneva, sans-serif; - color: #000000; - position: absolute; - left: 1em; - top: 2em; - z-index: 99; - margin-left: 0; - width: relative; - display: block; -} - -.tooltip:hover em { - font-family: Candara, Tahoma, Geneva, sans-serif; - font-size: 1.2em; - font-weight: bold; - display: block; - padding: 0.2em 0 0.6em 0; -} - -.classic { - padding: 0.8em 1em; -} - -* html a:hover { - background: transparent; -} - -.classic { - background: #9FDAEE; - border: 1px solid #2BB0D7; -} - -.pane4-open { - position: absolute; - right: 5px; - width: auto; - height: auto; - padding: 5px 10px; - text-align: center; - border: 1px solid #999; - z-index: 20000; - background: #609acc; - margin-top: 3px; -} - -.report-header { - background-color: #f8f8f8; - border-color: #b2b2b2; - background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); - color: #444444; - top: 0; - border-top-width: 0; - border-bottom-width: 1px; - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - position: absolute; - right: 0; - left: 0; - z-index: 10; - box-sizing: border-box; - /*padding: 5px;*/ - width: 100%; - height: 44px; - border-width: 0; - border-style: solid; - border-top: 1px solid transparent; - border-bottom: 1px solid #dddddd; - background-size: 0; -} - -.header-text { - padding-top: 11px; - padding-bottom: 12px; - /* color: #444444; */ - line-height: 20px; - /* position: fixed; */ - /* display: block; */ - padding: 10px; - width: 100%; - text-align: center; -} - -.info_icon { - cursor: pointer; - align: right; - vertical-align: middle; - padding: 2px; - border: 0; - -} - -.groupTop { - border-top: 2px solid #000 !important; - font-weight: bold !important; - font-style: italic !important; -} diff --git a/docs/Reports/cv32e40p/2020-11-02/resources/information.png b/docs/Reports/cv32e40p/2020-11-02/resources/information.png deleted file mode 100644 index 22cf6e9d57415ad9712c7e9ce1680d7dd4d48163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 zcmaJ>ZD<>19KR%P)`hd}rfe0Z$F;13E%%a_rgv?+X1T;gcO^?Ai%{7vcTbz6y_eoS zZPGF!?FMGdVLphC?#mcOsvl%?D3l@QLxjCl*cgZu#IX-5BGj=W`eEpET@(FaJh*$F z=g;r=`@cSSE;afpzU!r37>41=qe2?39nRaf6MefM|0SWN3&wLWV~oS1WC1Ly7 zHE9B*fuzh$-vUDz=IK?lIhYfV@v@;&l7pd2nu*vLHgvdTO7bLtL>^42dW77#@fAs^ zN`yQS5*g8qfr5H;-U6BV(X2c_DRT;Wc$gR}@kl@eP$Ej&ly38-2)U)pqrGFMNn#5E zCnMz3pmJi0h#3|jLKNeZnSPe&4^nK9;ey;D!q2b_&H8C3>|+@|6y_P0*nUXl%~Hns zw2;{Lg-#K&0HMj#bg@{ZiUG>7CTN!9IGXX(e!mYPeD<6UrIJs#dm0J?uw_d%p=#)a zqbTK#85ki^q)$`O%%-evZijfQDT#Od^&EQ7j=!vZ_0lEruxaN!^B$E`y{H zA&~~9stO+ua7>H|CxX#|7|X`lfiM%~;sabLkPu@1ey+h440%QaI&5&2CU<~o$#sT7 zGm&QjSn4cL5|*J6TS@b3>sW-AdfQy3Wh~)%OD>Iqp`F(LtJMt?njdG|99(p0jy}-Q zyjy6n`^GlWrE(oe3ejw7J^${~mrE|Z;F|V#47#qlvcI}JHarhkM^58!vU_%4!Yh5A zM{f|6JI@i6=i%^5G@e?$mHPZtZE<J%C*-sm#1DNen0b>UCzBydAt0_-nAWX z6_%nSZO>kEee#9(N4Ia~U!@0^Pux)`TH04U2Rutu$sBs zyWc&H@9uuT@cfm*?&ZBo4Wv$A8N@3aJ&$Pl+-udZKa`TI*wUDEeBE6?UYOR)^&fEY z;BRZ2-d~R8)_*$t(UE@Ca=d+T@ZUJs0vUD%U@;S06; R@LA_il8lcEpB_22_&503kVpUk diff --git a/docs/Reports/cv32e40p/2020-11-02/resources/jquery.css b/docs/Reports/cv32e40p/2020-11-02/resources/jquery.css deleted file mode 100644 index ae89d7fdd..000000000 --- a/docs/Reports/cv32e40p/2020-11-02/resources/jquery.css +++ /dev/null @@ -1,121 +0,0 @@ - -table.treetable span.indenter { - display: inline-block; - margin: 0; - padding: 0; - text-align: right; - - /* Disable text selection of nodes (for better D&D UX) */ - - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - -webkit-user-select: none; - - /* Force content-box box model for indenter (Bootstrap compatibility) */ - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - - - width: 19px; -} - -table.treetable span.indenter a { - background-position: left center; - background-repeat: no-repeat; - display: inline-block; - text-decoration: none; - width: 19px; -} -table.treetable { - border: 1px solid #888; - border-collapse: collapse; - font-size: .8em; - line-height: 1; - margin: .6em 0 1.8em 0; - width: 100%; -} - -table.treetable caption { - font-size: .9em; - font-weight: bold; - margin-bottom: .2em; -} - -table.treetable thead { - background: #aaa url(data:image/png;base64,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) repeat-x top left; - font-size: .9em; -} - -table.treetable thead tr th { - border: 1px solid #888; - font-weight: normal; - padding: .3em 1em .1em 1em; - text-align: left; -} - -table.treetable tbody tr td { - cursor: default; - padding: .3em 1em; -} - -table.treetable span { - background-position: center left; - background-repeat: no-repeat; - padding: .2em 0 .2em 1.5em; -} - -table.treetable span.file { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC); -} - -table.treetable span.folder { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC); -} - -table.treetable tr.collapsed span.indenter a { - background-image: url(data:image/gif;base64,R0lGODlhCwALAPcAAAAAAKWMa///xv////9A/4CAgP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAALAAsAAAg3AAkIHEhQYIGDCBEaHMCw4YACCxkCaAiRQIGGExlWvAigY8eHEQdkBGkRI8WQDjcmTFiwJYGAAAA7); -} - -table.treetable tr.expanded span.indenter a { - background-image: url(data:image/gif;base64,R0lGODlhCwALAPcAAAAAAKWMa///xv////9A/4CAgP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAALAAsAAAgyAAkIHEhQYIGDCBEaHMCw4YACCx0yhEiggMSJCwFo1PgwokSKFi+CvNixYsKEBVMSCAgAOw==); -} - -table.treetable tr.branch { - background-color: #f9f9f9; -} - -table.treetable tr.selected { - background-color: #3875d7; - color: #fff; -} - -table.treetable tr.collapsed.selected span.indenter a { - background-image: url(data:image/gif;base64,R0lGODlhCwALAPcAAAAAAKWMa///xv////9A/4CAgP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAALAAsAAAg3AAkIHEhQYIGDCBEaHMCw4YACCxkCaAiRQIGGExlWvAigY8eHEQdkBGkRI8WQDjcmTFiwJYGAAAA7); -} - -table.treetable tr.expanded.selected span.indenter a { - background-image: url(data:image/gif;base64,R0lGODlhCwALAPcAAAAAAKWMa///xv////9A/4CAgP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAALAAsAAAgyAAkIHEhQYIGDCBEaHMCw4YACCx0yhEiggMSJCwFo1PgwokSKFi+CvNixYsKEBVMSCAgAOw==); -} - -table.treetable tr.accept { - background-color: #a3bce4; - color: #fff -} - -table.treetable tr.collapsed.accept td span.indenter a { - background-image: url(data:image/gif;base64,R0lGODlhCwALAPcAAAAAAKWMa///xv////9A/4CAgP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAALAAsAAAg3AAkIHEhQYIGDCBEaHMCw4YACCxkCaAiRQIGGExlWvAigY8eHEQdkBGkRI8WQDjcmTFiwJYGAAAA7); -} - -table.treetable tr.expanded.accept td span.indenter a { - background-image: url(data:image/gif;base64,R0lGODlhCwALAPcAAAAAAKWMa///xv////9A/4CAgP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAQALAAAAAALAAsAAAgyAAkIHEhQYIGDCBEaHMCw4YACCx0yhEiggMSJCwFo1PgwokSKFi+CvNixYsKEBVMSCAgAOw==); -} - -#main { - background: #fff; - border-left: 20px solid #eee; - border-right: 20px solid #eee; - margin: 0 auto; - max-width: 800px; - padding: 20px; -} diff --git a/docs/Reports/cv32e40p/2020-11-02/resources/jquery.js b/docs/Reports/cv32e40p/2020-11-02/resources/jquery.js deleted file mode 100644 index 4b57db620..000000000 --- a/docs/Reports/cv32e40p/2020-11-02/resources/jquery.js +++ /dev/null @@ -1,12696 +0,0 @@ - -/*! - * jQuery JavaScript Library v1.10.2 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:48Z - */ -(function( window, undefined ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -//"use strict"; -var - // The deferred used on DOM ready - readyList, - - // A central reference to the root jQuery(document) - rootjQuery, - - // Support: IE<10 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "1.10.2", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler - completed = function( event ) { - - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } - }, - // Clean-up method for dom ready events - detach = function() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !core_hasOwn.call(obj, "constructor") && - !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( jQuery.support.ownLast ) { - for ( key in obj ) { - return core_hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || core_hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - if ( scripts ) { - jQuery( scripts ).remove(); - } - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: function( data ) { - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - if ( data === null ) { - return data; - } - - if ( typeof data === "string" ) { - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - if ( data ) { - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - } - } - } - - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Use native String.trim function wherever possible - trim: core_trim && !core_trim.call("\uFEFF\xA0") ? - function( text ) { - return text == null ? - "" : - core_trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( core_indexOf ) { - return core_indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.10.2 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = "
"; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - - var all, a, input, select, fragment, opt, eventName, isSupported, i, - div = document.createElement("div"); - - // Setup - div.setAttribute( "className", "t" ); - div.innerHTML = "
a"; - - // Finish early in limited (non-browser) environments - all = div.getElementsByTagName("*") || []; - a = div.getElementsByTagName("a")[ 0 ]; - if ( !a || !a.style || !all.length ) { - return support; - } - - // First batch of tests - select = document.createElement("select"); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName("input")[ 0 ]; - - a.style.cssText = "top:1px;float:left;opacity:.5"; - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - support.getSetAttribute = div.className !== "t"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName("link").length; - - // Get the style information from getAttribute - // (IE uses .cssText instead) - support.style = /top/.test( a.getAttribute("style") ); - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - support.hrefNormalized = a.getAttribute("href") === "/a"; - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - support.opacity = /^0.5/.test( a.style.opacity ); - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - support.cssFloat = !!a.style.cssFloat; - - // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) - support.checkOn = !!input.value; - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - support.optSelected = opt.selected; - - // Tests for enctype support on a form (#6743) - support.enctype = !!document.createElement("form").enctype; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; - - // Will be defined later - support.inlineBlockNeedsLayout = false; - support.shrinkWrapBlocks = false; - support.pixelPosition = false; - support.deleteExpando = true; - support.noCloneEvent = true; - support.reliableMarginRight = true; - support.boxSizingReliable = true; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE<9 - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - // Check if we can trust getAttribute("value") - input = document.createElement("input"); - input.setAttribute( "value", "" ); - support.input = input.getAttribute( "value" ) === ""; - - // Check if an input maintains its value after becoming a radio - input.value = "t"; - input.setAttribute( "type", "radio" ); - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment = document.createDocumentFragment(); - fragment.appendChild( input ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); - - div.cloneNode( true ).click(); - } - - // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - for ( i in { submit: true, change: true, focusin: true }) { - div.setAttribute( eventName = "on" + i, "t" ); - - support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; - } - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Support: IE<9 - // Iteration over object's inherited properties before its own. - for ( i in jQuery( support ) ) { - break; - } - support.ownLast = i !== "0"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, tds, - divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - body.appendChild( container ).appendChild( div ); - - // Support: IE8 - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - div.innerHTML = "
t
"; - tds = div.getElementsByTagName("td"); - tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Support: IE8 - // Check if empty table cells still have offsetWidth/Height - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check box-sizing and margin behavior. - div.innerHTML = ""; - div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - if ( typeof div.style.zoom !== core_strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.innerHTML = ""; - div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Support: IE6 - // Check if elements with layout shrink-wrap their children - div.style.display = "block"; - div.innerHTML = "
"; - div.firstChild.style.width = "5px"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - - if ( support.inlineBlockNeedsLayout ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild( container ); - - // Null elements to avoid leaks in IE - container = div = tds = marginDiv = null; - }); - - // Null elements to avoid leaks in IE - all = select = fragment = opt = a = input = null; - - return support; -})({}); - -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function internalData( elem, name, data, pvt /* Internal Use Only */ ){ - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( jQuery.support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } -} - -jQuery.extend({ - cache: {}, - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "applet": true, - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - // Do not set data on non-element because it will not be cleared (#8335). - if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { - return false; - } - - var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; - - // nodes accept data unless otherwise specified; rejection can be conditional - return !noData || noData !== true && elem.getAttribute("classid") === noData; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - data = null, - i = 0, - elem = this[0]; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[i].name; - - if ( name.indexOf("data-") === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button|object)$/i, - rclickable = /^(?:a|area)$/i, - ruseDefault = /^(?:checked|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - getSetInput = jQuery.support.input; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var ret, hooks, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // Use proper attribute retrieval(#6932, #12072) - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // oldIE doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - elem[ propName ] = false; - // Support: IE<9 - // Also clear defaultChecked/defaultSelected (if appropriate) - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = - elem[ propName ] = false; - } - - // See #9699 for explanation of this approach (setting first, then removal) - } else { - jQuery.attr( elem, name, "" ); - } - - elem.removeAttribute( getSetAttribute ? name : propName ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - return tabindex ? - parseInt( tabindex, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - // IE<8 needs the *property* name - elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); - - // Use defaultChecked and defaultSelected for oldIE - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; - } - - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? - function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - jQuery.expr.attrHandle[ name ] = fn; - return ret; - } : - function( elem, name, isXML ) { - return isXML ? - undefined : - elem[ jQuery.camelCase( "default-" + name ) ] ? - name.toLowerCase() : - null; - }; -}); - -// fix oldIE attroperties -if ( !getSetInput || !getSetAttribute ) { - jQuery.attrHooks.value = { - set: function( elem, value, name ) { - if ( jQuery.nodeName( elem, "input" ) ) { - // Does not return so that setAttribute is also used - elem.defaultValue = value; - } else { - // Use nodeHook if defined (#1954); otherwise setAttribute is fine - return nodeHook && nodeHook.set( elem, value, name ); - } - } - }; -} - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = { - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - elem.setAttributeNode( - (ret = elem.ownerDocument.createAttribute( name )) - ); - } - - ret.value = value += ""; - - // Break association with cloned elements by also using setAttribute (#9646) - return name === "value" || value === elem.getAttribute( name ) ? - value : - undefined; - } - }; - jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = - // Some attributes are constructed with empty-string values when not defined - function( elem, name, isXML ) { - var ret; - return isXML ? - undefined : - (ret = elem.getAttributeNode( name )) && ret.value !== "" ? - ret.value : - null; - }; - jQuery.valHooks.button = { - get: function( elem, name ) { - var ret = elem.getAttributeNode( name ); - return ret && ret.specified ? - ret.value : - undefined; - }, - set: nodeHook.set - }; - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - set: function( elem, value, name ) { - nodeHook.set( elem, value === "" ? false : value, name ); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }; - }); -} - - -// Some attributes require a special call on IE -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !jQuery.support.hrefNormalized ) { - // href/src property should get the full normalized URL (#10299/#12915) - jQuery.each([ "href", "src" ], function( i, name ) { - jQuery.propHooks[ name ] = { - get: function( elem ) { - return elem.getAttribute( name, 4 ); - } - }; - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Note: IE uppercases css property names, but if we were to .toLowerCase() - // .cssText, that would destroy case senstitivity in URL's, like in "background" - return elem.style.cssText || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = value + "" ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Even when returnValue equals to undefined Firefox will still show alert - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === core_strundefined ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - ret = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = ret.push( cur ); - break; - } - } - } - - return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; - }); -} -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
", "
" ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - col: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for (; i < l; i++ ) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch(e) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[i], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } -}); - -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); - } -} - -function cloneCopyEvent( src, dest ) { - - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( manipulation_rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); - - if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], - i = 0; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !jQuery.support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
" && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); - } - } - } - - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !jQuery.support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = jQuery.support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== core_strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - core_deletedIds.push( id ); - } - } - } - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); -jQuery.fn.extend({ - wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapAll( html.call(this, i) ); - }); - } - - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); - - if ( this[0].parentNode ) { - wrap.insertBefore( this[0] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { - elem = elem.firstChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function(i) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var iframe, getStyles, curCSS, - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity\s*=\s*([^)]*)/, - rposition = /^(top|right|bottom|left)$/, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = jQuery._data( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var len, styles, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - - // Wrapped to prevent IE from throwing errors when 'invalid' values are provided - // Fixes bug #5509 - try { - style[ name ] = value; - } catch(e) {} - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var num, val, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -if ( window.getComputedStyle ) { - getStyles = function( elem ) { - return window.getComputedStyle( elem, null ); - }; - - curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; - }; -} else if ( document.documentElement.currentStyle ) { - getStyles = function( elem ) { - return elem.currentStyle; - }; - - curCSS = function( elem, name, _computed ) { - var left, rs, rsLeft, - computed = _computed || getStyles( elem ), - ret = computed ? computed[ name ] : undefined, - style = elem.style; - - // Avoid setting ret to empty string here - // so we don't default to auto - if ( ret == null && style && style[ name ] ) { - ret = style[ name ]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are proportional to the parent element instead - // and we can't measure the parent instead because it might trigger a "stacking dolls" problem - if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { - - // Remember the original values - left = style.left; - rs = elem.runtimeStyle; - rsLeft = rs && rs.left; - - // Put in the new values to get a computed value out - if ( rsLeft ) { - rs.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if ( rsLeft ) { - rs.left = rsLeft; - } - } - - return ret === "" ? "auto" : ret; - }; -} - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery("