如何在Verilog中实现字符串长度的计算功能
Verilog 字符串长度计算实现方案
Verilog中字符串本质是由8位ASCII值组成的序列,每个字符占1字节(8bit),存储在reg类型变量中时,变量位宽为8*N,N为可容纳的最大字符数,具体计算逻辑可分为两种场景实现:
静态字符串长度计算(编译期确定)
如果是编译期就固定的字符串常量,直接使用Verilog-2001引入的系统函数$len()即可快速获取长度:
module static_str_len_test; parameter STR_CAT = "CAT"; parameter STR_APPLE = "APPLE"; initial begin $display("String \"CAT\" length is %0d", $len(STR_CAT)); // 输出3 $display("String \"APPLE\" length is %0d", $len(STR_APPLE)); // 输出5 end endmodule
动态字符串长度计算(运行期可修改)
如果是运行时可修改的字符串变量,需要自行实现遍历逻辑,通常约定以\0(ASCII 0值)作为字符串结束符,实现代码如下:
module dynamic_str_len #( parameter MAX_STR_LEN = 128 // 自定义支持的最大字符串长度 )( input [8*MAX_STR_LEN-1:0] str_in, // 输入字符串 output reg [7:0] len_out // 输出计算得到的长度 ); integer i; always @(*) begin len_out = 0; // 从首字符开始遍历,遇到结束符停止 for (i = 0; i < MAX_STR_LEN; i = i + 1) begin if (str_in[8*(MAX_STR_LEN - i) +: 8] != 8'h00) begin len_out = len_out + 1; end else begin break; end end end endmodule
验证示例
module tb; reg [8*16-1:0] test_str; wire [7:0] str_len; dynamic_str_len #(.MAX_STR_LEN(16)) u_calc ( .str_in(test_str), .len_out(str_len) ); initial begin test_str = "CAT"; #10; $display("Input: CAT, Length: %0d", str_len); // 输出3 test_str = "APPLE"; #10; $display("Input: APPLE, Length: %0d", str_len); // 输出5 $finish; end endmodule
如果使用SystemVerilog,可直接调用内置的str.len()方法,无需自行实现遍历逻辑。
内容的提问来源于stack exchange,提问作者Bunny Sharma
相关产品推荐
相关产品推荐

