在 Verilog 中转换线值以进行进一步处理

发布于 2024-12-06 07:19:02 字数 479 浏览 2 评论 0原文

我是 Verilog 新手。

我已经编写了将线值转换为整数的代码:

wire [31:0] w1;
integer k;
always @ (w1) k = w1;

来源:在verilog中将连线值转换为整数

现在,对于下一部分,我收到错误!

wire [63:0] w2; // Suppose it contains some value
wire [63:0] w3;
assign w3[k-1:0] = w2[k-1:0]; // ERROR in this line

ERROR : k is not a constant.

我该如何解决这个问题?

I'm new to Verilog.

I have written code to convert a wire value to an integer:

wire [31:0] w1;
integer k;
always @ (w1) k = w1;

Source: converting a wire value to an integer in verilog

Now, for the next part I get an ERROR!

wire [63:0] w2; // Suppose it contains some value
wire [63:0] w3;
assign w3[k-1:0] = w2[k-1:0]; // ERROR in this line

ERROR : k is not a constant.

How do I solve this issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

又爬满兰若 2024-12-13 07:19:02

Verilog 要求部分选择(例如 [msb:lsb] 的代码用于选择向量的一部分)是恒定的。要访问可变大小的位组需要更复杂的东西。这是一种实现方法:

wire [63:0] src;
wire [6:0] k;

wire [127:0] mask = { { 64 { 1'b0 } }, { 64 { 1'b1 } } } << k;

wire [63:0] dest;

assign dest = mask[127:64] & src;

这里的技术是构造一个由 64 个 0 后跟 64 个 1 组成的向量,将该向量移位一个可变量,然后使用该向量的一部分作为限定掩码来控制传输哪些位从srcdest

一个相关的概念对您的示例没有帮助,但值得注意:Verilog-2001 引入了“索引部分选择”。索引部分选择指定基本索引和宽度。宽度需要恒定,但基本索引不需要恒定。索引部分选择的语法为 vec[base+:width]vec[base-:width]

Verilog requires that part selects (code like [msb:lsb] to select part of a vector) be constant. To access a variable-sized group of bits requires something more complicated. Here is one way to do it:

wire [63:0] src;
wire [6:0] k;

wire [127:0] mask = { { 64 { 1'b0 } }, { 64 { 1'b1 } } } << k;

wire [63:0] dest;

assign dest = mask[127:64] & src;

The technique here is to construct a vector of 64 zeros followed by 64 ones, shift that vector by a variable amount, and then use a portion of the vector as a qualifying mask to control which bits are transferred from src to dest.

A related concept which does not help in your example but which is worth being aware of: Verilog-2001 introduced the "indexed part-select". An indexed part select specifies a base index and a width. The width is required to be constant but the base index does not need to be constant. The syntax for an indexed part select is vec[base+:width] or vec[base-:width].

自演自醉 2024-12-13 07:19:02

Verilog 2001 中的部分选择运算符可能对您想要实现的目标很有用。

基本上,verilog 允许起始索引是可变的,但需要赋值的宽度是恒定的。 “+:”运算符表示从索引值向上计数,“-:”运算符表示从索引值向上计数。

你可以做类似的事情,
赋值 w3[k-1 -: 8 ] = w2[k-1 -: 8]; // 其中向下复制8位

在下面的文档中搜索“+:”。
http://www.sutherland-hdl.com/papers/2001 -Wescon-tutorial_using_Verilog-2001_part1.pdf

注意,通常可变部分选择被认为是不好的verilog。

The part select operators in Verilog 2001 could be useful for what you want to achieve.

Basically verilog allows for the starting index to be variable but needs the width of the assignment to be constant. The "+:" operator indicates counting upwards from the index value and vice-versa for "-:".

You can do something like,
assign w3[k-1 -: 8 ] = w2[k-1 -: 8]; // Where 8 bits is copied downwards

Search for "+:" in the below document.
http://www.sutherland-hdl.com/papers/2001-Wescon-tutorial_using_Verilog-2001_part1.pdf

Word of caution, generally variable part selects is considered as bad verilog.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文