如何对列表进行搜索

  • 2019 年 10 月 30 日
  • 筆記

思考空间

代码第17行对RAM的初始化是否可综合?

logic [31:0] ram_block[1024] = '{default:0}

该语句是可以综合的,可在综合后的网表中选中该RAM,在相应的属性窗口中可看到初始值。

对列表搜索的目的是查找特定的元素,这些元素应该与指定的模式相匹配。此时,可用命令lsearch。该命令接收两个参数,第一个参数为列表,第二个参数为匹配模式。

lsearch有三种搜索模式,分别由选项-glob、-exact和-regexp指定。其中默认模式为-glob。该模式按照string match的命令规则进行搜索。

lsearch的返回值是列表中第一个与指定模式匹配的元素的索引。看一个案例,如下图所示。匹配模式为A*,故返回元素AFF对应的索引值3。选项-all可返回所有匹配结果。因此,对于匹配模式[AB]FF,返回的是AFF和BFF对应的索引3和4。

-exact是严格匹配,如下图所示案例。如果匹配模式为LUT*,则会返回为-1,表明列表中没有匹配的元素。

如果需要返回匹配元素而非该元素的索引,可以添加选项-inline,如下图所示。只有-inline的情况下,返回第一个匹配结果;如果同时使用-all,则可返回所有匹配结果。

选项-not可实现对匹配结果取反,以下图所示案例为例。匹配模式为LUT*,-not就会使得lsearch的返回值为所有不与之匹配的元素。-not可以与-inline或-all联合使用。

另一方面,如果仅仅是为了确定指定列表中是否包含某个特定元素,可以用in;如果要确定指定列表中不包含某个特定元素,则可以用ni(not in)。看如下图所示案例。显然,此时使用in或者ni比lsearch更高效。

思考空间

给定列表{RAMB18 RAMB36 LUTRAM RAMB},要求从中找出RAMB18和RAMB36。